百萬連接測試之方法篇
在上一篇中我們講述了百萬連接的測試過程及出現(xiàn)的問題和解決辦法,有同學(xué)對其中的測試方法也有興趣,我在這里再補(bǔ)充一下。這里的測試方法主要是指測試客戶端如何發(fā)起百萬連接并保持它們。由于受到單機(jī)單ip的端口數(shù)限制,即如下
pomelo@debian:~/socktest$ cat /proc/sys/net/ipv4/ip_local_port_range 2048 65500 |
單個客戶端ip只能建立6萬多連接,所以我們需要大約50個獨(dú)立ip發(fā)起300萬的連接。為簡單起見,使用50臺512M內(nèi)存的虛擬機(jī)作為客戶端。問題歸結(jié)為兩個方面
1. 單客戶端如何建立并保持6萬連接
2. 如何控制幾十個客戶端
我們以java編寫客戶端代碼。首先我們嘗試的是一線程一連接的方式。這樣在java中就需要維護(hù)6萬個線程及其相關(guān)的對象,包括連接對象。很快我們就發(fā)現(xiàn)客戶端java進(jìn)程出現(xiàn)了OOM,512M內(nèi)存不夠用了。我們分析下測試目標(biāo),目的是保持6萬個連接對象,在這種方式下我們相當(dāng)于是使用了線程這種容器來保存這些對象,但由于線程本身的內(nèi)存開銷巨大,因此我們應(yīng)該考慮換個輕量級的瓶子來裝這些連接對象。
最終代碼如下,即在一個線程內(nèi)順序建立連接,并將連接保存到一個數(shù)組中,至此就解決了上文問題中的一個方面
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ī)器上的測試程序。主要有兩個問題需要注意,一是ssh需要認(rèn)證,我們可以在任意機(jī)器上產(chǎn)生無密碼的ssh公私鑰對,將公鑰分發(fā)到客戶端機(jī)器上。二是設(shè)置一個ip列表的配置文件。
這樣,兩個問題都解決了,可以開始測試了。測試過程及其問題不完全記錄可以點(diǎn)這里。
相關(guān)文章:
posted on 2013-12-17 09:02 順其自然EVO 閱讀(299) 評論(0) 編輯 收藏 所屬分類: web 前端性能測試