<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點點滴滴。

    100萬并發(fā)連接服務(wù)器筆記之準(zhǔn)備篇

    前言

    測試一個非常簡單服務(wù)器如何達到100萬(1M=1024K連接)的并發(fā)連接,并且這些連接一旦連接上服務(wù)器,就不會斷開,一直連著。
    環(huán)境受限,沒有服務(wù)器,剛開始都是在自己的DELL筆記本上測試,憑借16G內(nèi)存,和優(yōu)秀的vmware workstation虛擬機配合,另外還得外借別人虛擬機使用,最終還得搭上兩臺2G內(nèi)存的臺式機(安裝centos),最終才完成1M并發(fā)連接任務(wù)。

    • 測試程序也很簡陋,一個C語言所寫服務(wù)器程序,沒有任何業(yè)務(wù)存在,收到請求后發(fā)送一些頭部,不斷開連接
    • 測試端程序也是使用C語言所寫,發(fā)送請求,然后等待接收數(shù)據(jù),僅此而已
    • 服務(wù)器端/測試端內(nèi)存都受限(8G不夠使用),要想完成1024K的目標(biāo),需要放棄一些東西,諸如業(yè)務(wù)不是那么完整
    • 一臺分配10G內(nèi)存Centos服務(wù)器,兩臺分配6G內(nèi)存Centos測試端,兩臺2G內(nèi)存Centos測試端
    • 假如熱心的您可以提供豐富的服務(wù)器資源,那就再好不過了。
    • 理論上200萬的并發(fā)連接(IO密集型),加上業(yè)務(wù),40G-50G的內(nèi)存大概能夠保證

    說明

    以前也做過類似的工作,量不大,沒記錄下來,一些壓力測試和調(diào)優(yōu),隨著時間流逝,早已忘記。這次是從零開始,基本上所有過程都會記錄,一步一步,每一步都會遇到問題,并且給出相關(guān)解決問題的方法,最終完成目標(biāo)。
    為了方便,服務(wù)器端程序和客戶端測試程序,都是使用C語言,不用像JAVA一樣需要預(yù)先指定內(nèi)存,感覺麻煩。使用較為原始的語言來寫,可以避免不必要的調(diào)優(yōu)工作。這中間,可能會穿插Java代碼的思考方式。

    可能需要懂點Linux,C,Java,假如您有更好的做法,或者建議,請直接告知,謝謝。

    Linux系統(tǒng)

    測試端和服務(wù)器端都選用較為熟悉的64位Centos 6.4,32位系統(tǒng)最多支持4G內(nèi)存,太受限。IO密集型應(yīng)用,對CPU要求不是很高。另外服務(wù)器確保安裝上gcc,那就可以開工了。
    所有端系統(tǒng)一旦安裝完之后,默認不做任何設(shè)置。

    服務(wù)器端程序

    服務(wù)器端程序依賴libev框架,需要提前編譯,然后存放到相應(yīng)位置。下面是具體服務(wù)器端代碼:

    編譯

    gcc server.c -o server ../include/libev.a -lm
    

    運行

    ./server -p 8000
    

    在源碼中默認指定了8000端口,可以通過-p進行指定新的端口。 開啟了8000端口進行監(jiān)聽請求,http協(xié)議處理類似于htmlfile chunked塊編碼傳輸。

    測試服務(wù)器端程序

    測試程序使用libevent框架,因其使用簡單,提供豐富易用接口,但需要提前下載,手動安裝:

    wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
    tar xvf libevent-2.0.21-stable.tar.gz
    cd libevent-2.0.21-stable
    ./configure --prefix=/usr
    make
    make install
    

    注意make和make install需要root用戶。

    測試端程序

    client1.c 源碼:

    備注:這部分代碼參考了A Million-user Comet Application with Mochiweb, Part 3 ,根據(jù)需要有所修改。

    編譯

    gcc -o client1 client1.c -levent
    

    運行

    ./client1
    

    可能在64位系統(tǒng)會遇到找不到libevent-2.0.so.5情況,需要建立一個軟連接

    ln -s /usr/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5
    

    即可自動連接IP地址為192.168.190.133:8000的服務(wù)器端應(yīng)用。

    第一個遇到的問題:文件句柄受限

    測試端程序輸出

    看看測試端程序client1輸出的錯誤信息:

    Chunks: 798 Bytes: 402990 Closed: 0
    Req: 192.168.190.133 -/test/900
    Req: 192.168.190.133 -/test/1000
    Chunks: 998 Bytes: 503990 Closed: 0
    [warn] socket: Too many open files
    [warn] socket: Too many open files
    [warn] socket: Too many open files
    

    服務(wù)器端程序輸出

    服務(wù)器端最后一條日志為

    online user 1018
    

    兩邊都遇到了文件句柄打開的情況。
    在服務(wù)器端查看已經(jīng)連接,并且端口號為8000的所有連接數(shù)量:

    netstat -nat|grep -i "8000"|wc -l 
    1019

    但與服務(wù)器端輸出數(shù)量對不上,增加所有已經(jīng)建立連接的選項:

    netstat -nat|grep -i "8000"|grep ESTABLISHED|wc -l 
    1018

    那么剩下的一條數(shù)據(jù)到底是什么呢?

    netstat -nat|grep -i "8000"|grep -v ESTABLISHED
    tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 

    也就是server.c監(jiān)聽的端口,數(shù)量上對的上。

    在測試服務(wù)器端,查看測試進程打開的文件句柄數(shù)量

    lsof -n|grep client1|wc -l
    1032
    

    再次執(zhí)行

    ulimit -n
    1024
    

    也是就是client1應(yīng)用程序共打開了1032個文件句柄,而不是1024,為什么?
    把當(dāng)前進程所有打開的文件句柄保存到文件中,慢慢研究 lsof -n|grep client1 > testconnfinfo.txt

    導(dǎo)出的文件可以參考: https://gist.github.com/yongboy/5260773
    除了第一行,我特意添加上供友善閱讀的頭部列定義,也就是1032行信息,但是需要注意頭部:

    
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    client1 3088 yongboy cwd DIR 253,0 4096 800747 /home/yongboy/workspace/c_socket.io_server/test
    client1 3088 yongboy rtd DIR 253,0 4096 2 /test_conn
    client1 3088 yongboy txt REG 253,0 9697 799991 /home/yongboy/workspace/c_socket.io_server/test/test_conn_1
    client1 3088 yongboy mem REG 253,0 156872 50404 /lib64/ld-2.12.so
    client1 3088 yongboy mem REG 253,0 1922152 78887 /lib64/libc-2.12.so
    client1 3088 yongboy mem REG 253,0 145720 76555 /lib64/libpthread-2.12.so
    client1 3088 yongboy mem REG 253,0 47064 69491 /lib64/librt-2.12.so
    client1 3088 yongboy mem REG 253,0 968730 26292 /usr/lib/libevent-2.0.so.5.1.9
    client1 3088 yongboy 0u CHR 136,2 0t0 5 /dev/pts/2
    client1 3088 yongboy 1u CHR 136,2 0t0 5 /dev/pts/2
    client1 3088 yongboy 2u CHR 136,2 0t0 5 /dev/pts/2
    client1 3088 yongboy 3u REG 0,9 0 4032 anon_inode
    client1 3088 yongboy 4u unix 0xffff88007c82f3c0 0t0 79883 socket
    client1 3088 yongboy 5u unix 0xffff880037c34380 0t0 79884 socket
    client1 3088 yongboy 6u IPv4 79885 0t0 TCP 192.168.190.134:58693->192.168.190.133:irdmi (ESTABLISHED)
    client1 3088 yongboy 7u IPv4 79889 0t0 TCP 192.168.190.134:58694->192.168.190.133:irdmi (ESTABLISHED)
    client1 3088 yongboy 8u IPv4 79891 0t0 TCP 192.168.190.134:58695->192.168.190.133:irdmi (ESTABLISHED)
    client1 3088 yongboy 9u IPv4 79893 0t0 TCP 192.168.190.134:58696->192.168.190.133:irdmi (ESTABLISHED)
    

    可以看到文件句柄是從0u開始,0u上面的8個(5個mem + 3個啟動)進程,1032 - 8 = 1024個文件句柄,這樣就和系統(tǒng)限制的值吻合了。

    root用戶編輯/etc/security/limits.conf文件添加:

    * soft nofile 1048576
    * hard nofile 1048576
    
    • soft是一個警告值,而hard則是一個真正意義的閥值,超過就會報錯。
    • soft 指的是當(dāng)前系統(tǒng)生效的設(shè)置值。hard 表明系統(tǒng)中所能設(shè)定的最大值
    • nofile - 打開文件的最大數(shù)目
    • 星號表示針對所有用戶,若僅針對某個用戶登錄ID,請?zhí)鎿Q星號

    注意:
    1024K x 1024 = 1048576K = 1M,1百萬多一點。

    備注:測試端和服務(wù)器端都需要作此設(shè)置,保存退出,然后reboot即可生效。

    第一個問題,就這樣克服了。再次運行 /client1測試程序,就不會出現(xiàn)受打開文件句柄的限制。但大概在測試端打開對外28200個端口時,會出現(xiàn)程序異常,直接退出。

    段錯誤

    這個也是程序沒有處理端口不夠用的異常,但可以通過增加端口進行解決。

    備注: 但測試端單機最多只能打開6萬多個連接,是一個問題,如何克服,下一篇解決此問題,并且還會遇到文件句柄的受限問題。

    posted on 2013-04-09 09:50 nieyong 閱讀(17127) 評論(3)  編輯  收藏 所屬分類: C1M

    評論

    # re: 100萬并發(fā)連接服務(wù)器筆記之準(zhǔn)備篇 2015-05-29 22:14 wander

    想問下博主的,模擬多客戶端測試怎么實現(xiàn)的
      回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之準(zhǔn)備篇 2015-06-01 13:58 nieyong

    @wander
    可以參考:
    http://www.tkk7.com/yongboy/archive/2013/04/09/397594.html
    http://www.tkk7.com/yongboy/archive/2013/04/10/397631.html
    這兩篇文章 :)  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之準(zhǔn)備篇 2015-10-13 16:36 godsoul

    博主,client1.c 源碼在哪里,能分享一下嗎,你說修改老外那篇,不知道修改了哪里  回復(fù)  更多評論   

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2015年6月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    統(tǒng)計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕精品亚洲无线码二区| 99麻豆久久久国产精品免费 | 久久精品国产亚洲沈樵| 久久WWW免费人成人片| 热re99久久6国产精品免费| 91成人免费观看在线观看| 91精品成人免费国产| 国产美女视频免费观看的网站| 一级视频免费观看| a一级爱做片免费| 三年在线观看免费观看完整版中文| 国产成人精品免费视频大全| 久久久久久av无码免费看大片| 国产日韩AV免费无码一区二区三区 | 亚洲色精品aⅴ一区区三区| 国产又黄又爽又刺激的免费网址 | 日日狠狠久久偷偷色综合免费| 四虎一区二区成人免费影院网址| 日本一区二区三区免费高清在线| 阿v免费在线观看| 无码精品人妻一区二区三区免费| 在线播放国产不卡免费视频| 成人自慰女黄网站免费大全| 最近免费中文字幕MV在线视频3| 久草福利资源网站免费| 国产免费丝袜调教视频| 毛片a级毛片免费观看品善网 | 在线观看免费视频一区| 香蕉成人免费看片视频app下载| 4444www免费看| 大地资源二在线观看免费高清| 日本一区二区三区日本免费| 亚洲精品色婷婷在线影院| 久久91亚洲人成电影网站| 亚洲成电影在线观看青青| 久久精品熟女亚洲av麻豆| 国产特黄特色的大片观看免费视频| 免费播放一区二区三区| 免费爱爱的视频太爽了| 自拍偷自拍亚洲精品第1页| 7777久久亚洲中文字幕蜜桃|