qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          百萬連接測試之方法篇

           在上一篇中我們講述了百萬連接的測試過程及出現的問題和解決辦法,有同學對其中的測試方法也有興趣,我在這里再補充一下。這里的測試方法主要是指測試客戶端如何發起百萬連接并保持它們。由于受到單機單ip的端口數限制,即如下

          pomelo@debian:~/socktest$ cat /proc/sys/net/ipv4/ip_local_port_range

          2048         65500

            單個客戶端ip只能建立6萬多連接,所以我們需要大約50個獨立ip發起300萬的連接。為簡單起見,使用50臺512M內存的虛擬機作為客戶端。問題歸結為兩個方面:

            1、單客戶端如何建立并保持6萬連接

            2、如何控制幾十個客戶端

            我們以java編寫客戶端代碼。首先我們嘗試的是一線程一連接的方式。這樣在java中就需要維護6萬個線程及其相關的對象,包括連接對象。很快我們就發現客戶端java進程出現了OOM,512M內存不夠用了。我們分析下測試目標,目的是保持6萬個連接對象,在這種方式下我們相當于是使用了線程這種容器來保存這些對象,但由于線程本身的內存開銷巨大,因此我們應該考慮換個輕量級的瓶子來裝這些連接對象。

            最終代碼如下,即在一個線程內順序建立連接,并將連接保存到一個數組中,至此就解決了上文問題中的一個方面

          private static int n = 0;
          private static Socket[] sockList = null;
          static {
              n = Integer.valueOf(Config.getProperty("socket.num"));
              sockList = new Socket[n];
          }
          public void connect(String host, int port) throws UnknownHostException {
              Socket so = null;
              long sleepTime = Integer.valueOf(Config.getProperty("socket.sleep"));
              for (int i=0;i<n;i++) {
                  try {
                     so = new Socket(host, port);
                     sockList[i] = so;
                     Thread.sleep(sleepTime);
                 } catch (IOException e) {
                     logger.error(e.getMessage());
                 } catch (InterruptedException e) {
                    
                 }
              }
          }

            接著,又是如何控制幾十臺客戶端呢?其實比較簡單,就是在shell腳本中通過ssh調用部署在客戶端機器上的測試程序。主要有兩個問題需要注意,一是ssh需要認證,我們可以在任意機器上產生無密碼的ssh公私鑰對,將公鑰分發到客戶端機器上。二是設置一個ip列表的配置文件。

            這樣,兩個問題都解決了,可以開始測試了。測試過程及其問題不完全記錄可以點這里。

          posted on 2013-06-05 10:43 順其自然EVO 閱讀(188) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2013年6月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宣汉县| 长泰县| 德庆县| 平安县| 沙湾县| 濮阳市| 通城县| 香河县| 吴川市| 大埔区| 交城县| 徐汇区| 望城县| 会同县| 湘乡市| 德州市| 寻乌县| 曲周县| 胶州市| 闵行区| 扎鲁特旗| 鸡泽县| 唐海县| 新龙县| 大丰市| 阿图什市| 翁源县| 台安县| 兴海县| 上杭县| 扶风县| 郯城县| 定结县| 介休市| 兴国县| 柘城县| 双桥区| 东乡族自治县| 彭州市| 彭山县| 龙陵县|