erlang網絡編程的幾個性能調優和注意點

轉載:http://www.lupaworld.com/action-viewstutorial-itemid-10191.html

 

 

前些天給echo_server寫了個非常簡單的連接壓力測試程序,

代碼
 
  1. -module(stress_test).  
  2.   
  3. -export([start/0, tests/1]).  
  4.   
  5. start() ->  
  6.     tests(12345).  
  7.   
  8. tests(Port) ->  
  9.     io:format("starting~n"),  
  10.     spawn(fun() -> test(Port) end),  
  11.     spawn(fun() -> test(Port) end),  
  12.     spawn(fun() -> test(Port) end),  
  13.     spawn(fun() -> test(Port) end).  
  14.   
  15. test(Port) ->  
  16.      case gen_tcp:connect("192.168.0.217", Port, [binary,{packet, 0}]) of  
  17.     {ok, _} ->  
  18.             test(Port);  
  19.     _ ->  
  20.         test(Port)  
  21.     end.  

一開始我的這個stress_test客戶端運行在windows上面, echo_server服務器端運行在linux上面。 結果接受了1016個連接就停止了. 於是我用ulimit -n 改了服務器端的文件描述符數量爲10240. 接着還是如此,折騰了幾天,最終還是沒有搞明白。

於是就求助於公司的linux編程牛人,結果讓我一倒...  客戶端沒有修改文件描述符個數. windows上得在註冊表裏面改.
牛人開始對這東西的性能感興趣了,剛好我摸了一陣子erlang的文檔,於是我倆就走向了erlang網絡連接的性能調優之旅啦~~過程真是讓人興奮。 我們很快通過了1024這一關~~到了4999個連接,很興奮.

但爲什麼4999個連接呢, 檢查一下代碼終於發現echo_server.erl定義了一個宏, 最大連接數爲5000. 我又倒~~
修改編譯之後, 連接數跑到101xx多了, 太哈皮了!
再測102400個連接時,到32767個連接數erl掛了~說是進程開得太多了. 好在記得這個erl的參數+P,可以定義erlang能生成的進程數. 默認是32768. 改了!

後面不知怎麼着,在81231個連接停止了. 新的性能瓶頸又卡了我們.  好在牛人對linux熟, 用strace(這東西會莫名地退出), stap查出一些苗頭.   我也想到在otp文檔好像提過另一個limit,那就是端口數...在此同時我們發現erlang在linux上是用的傳統poll模型. 但查erlang的源代碼發現是支持epoll的. 在網上搜了半天,終於搜到了個maillist的帖子.

代碼
  1. $./configure --enable-kernel-poll  


由於我們的測試服務器是雙核的,我們在配置的時候也打開了smp支持.  歡快的make  & make install之後....
/proc/sys/net/ipv4/ip_local_port_range 的內容改成了1024到65535.  最多也也能改成65535 :)

代碼
  1. $echo 1024 65535 > ip_local_port_range  


另外再添加一個erl的環境變量

代碼
  1. $export ERL_MAX_PORTS=102400  


於是開始跑了,不過這次跑不一樣了

echo_server
 
  1. $erl -noshell  +P 102400 +K true +S 2 -smp -s echo_server start  

   

stress_test
 
  1. $erl -noshell  +P 102400 +K true +S 2 -smp -s stress_test start  

這裏的+K true,表示使用內核poll,+S 2 表示兩個核. 這樣可歡快啦~~~ 10w大關過咯! 而且比剛纔沒用epoll的速度快暴多~~
於是我們又開始了204800個連接發測試了~~~

用top一看cpu佔用率極低,服務器只在5%左右。 內存也不是很大~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章