qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          百萬連接測試之方法篇

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

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

          2048         65500

            單個(gè)客戶端ip只能建立6萬多連接,所以我們需要大約50個(gè)獨(dú)立ip發(fā)起300萬的連接。為簡單起見,使用50臺512M內(nèi)存的虛擬機(jī)作為客戶端。問題歸結(jié)為兩個(gè)方面:

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

            2、如何控制幾十個(gè)客戶端

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

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

          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) {
                    
                 }
              }
          }

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

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

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

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂溪县| 崇文区| 抚州市| 万载县| 巴东县| 自治县| 瓮安县| 宁都县| 敖汉旗| 通城县| 盐池县| 通化市| 德昌县| 行唐县| 平顺县| 玉山县| 秭归县| 双柏县| 什邡市| 南川市| 抚州市| 信丰县| 阿荣旗| 拉萨市| 四会市| 南汇区| 冀州市| 神木县| 龙岩市| 土默特左旗| 鹰潭市| 体育| 临颍县| 沙河市| 蒙山县| 泾川县| 克山县| 江山市| 美姑县| 绥滨县| 木兰县|