日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NGINX轻松管理10万长连接

發(fā)布時(shí)間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NGINX轻松管理10万长连接 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一 前言 當(dāng)管理大量連接時(shí),特別是只有少量活躍連接,NGINX有比較好的CPU和RAM利用率,如今是多終端保持在線的時(shí)代,更能讓NGINX發(fā)揮這個(gè)優(yōu)點(diǎn)。本文做一個(gè)簡單測(cè)試,NGINX在一個(gè)普通PC虛擬機(jī)上維護(hù)100k的HTTP長連接,然后查看NGINX和系統(tǒng)的資源利用率。 二 測(cè)試環(huán)境 1.服務(wù)端 硬件:雙核2.3GHz,2GB內(nèi)存 軟件:CentOS 6.5, kernel 2.6.32, ?gcc?4.4.7, nginx 1.4.7 IP:10.211.55.8 內(nèi)核參數(shù)調(diào)整:
$ /sbin/sysctl -w net.netfilter.nf_conntrack_max=102400 # 提升系統(tǒng)整體連接數(shù) $ /sbin/sysctl net.netfilter.nf_conntrack_max #驗(yàn)證是否生效 NGINX從源碼編譯時(shí)帶--with-http_stub_status_module,只列出與默認(rèn)設(shè)置不同的部分:
worker_rlimit_nofile 102400; events { worker_connections? 102400; } http { # 設(shè)一個(gè)比較大得超時(shí),客戶端能以平緩的方式發(fā)送HEAD請(qǐng)求來維持KeepAlive keepalive_timeout? 3600; #監(jiān)控連接數(shù),本機(jī)訪問 location /nginx_status { stub_status on; access_log?? off; allow 127.0.0.1; deny all; } } 2. 客戶端1 硬件:雙核2.3GHz,2GB內(nèi)存 軟件:CentOS 6.5, kernel 2.6.32, gcc?4.4.7, Python 3.3.5 IP:10.211.55.9 內(nèi)核參數(shù)調(diào)整: $ /sbin/sysctl -w net.ipv4.ip_local_port_range="1024 61024” #實(shí)際只使用50000個(gè)端口 $ /sbin/sysctl net.ipv4.ip_local_port_range #驗(yàn)證是否生效 $ vi /etc/security/limits.conf #提升當(dāng)前用戶的最大打開文件數(shù)nofile(hard >= soft > 50000) $ ulimit -n #驗(yàn)證是否生效,可能需重啟shell Python 3.3.5從源碼編譯,如下配置: $ pyvenv ~/pyvenv #創(chuàng)建虛擬環(huán)境,便于測(cè)試 $ . ~/pyvenv/bin/activate #激活虛擬環(huán)境 (pyvenv) $ python get-pip.py #從pip官網(wǎng)下載get-pip.py (pyvenv) $ pip install asyncio #安裝異步IO模塊 因?yàn)锳pache ab只能批量請(qǐng)求,不能維持連接,所以自己寫了一個(gè)HTTP長連接測(cè)試工具asyncli.py,詳細(xì)實(shí)現(xiàn)見http://blog.chinaunix.net/uid-190176-id-4223282.html。 基本用法: (pyvenv) $ python?asyncli.py?--help usage:?asyncli.py?[-h] [-c CONNECTIONS] [-k KEEPALIVE] url asyncli positional arguments: url?????????????????? page address optional arguments: -h, --help??????????? show this help message and exit -c CONNECTIONS, --connections CONNECTIONS number of connections simultaneously -k KEEPALIVE, --keepalive KEEPALIVE HTTP keepalive timeout 工作機(jī)制: 每隔10毫秒連續(xù)創(chuàng)建10個(gè)連接(每秒約1000個(gè)連接),直到總連接數(shù)達(dá)到CONNECTIONS,每個(gè)連接都會(huì)睡眠[1, KEEPALIVE / 2]的一個(gè)隨機(jī)數(shù)(單位為秒),然后向服務(wù)端url發(fā)送一個(gè)HEAD請(qǐng)求來維持HTTP KeepAlive,然后重復(fù)上一個(gè)睡眠步驟。。。 3. 客戶端2 與客戶端1完全一致,除了IP為10.211.55.10 三?運(yùn)行與輸出 1. 服務(wù)端系統(tǒng)空閑 # vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r? b?? swpd?? free?? buff? cache?? si?? so??? bi??? bo?? in?? cs us sy id wa st 0? 0????? 0 1723336? 11624? 76124??? 0??? 0??? 62???? 1?? 26?? 28? 0? 0 100? 0? 0 2. 服務(wù)端啟動(dòng)NGINX,無外部WEB請(qǐng)求 # nginx # vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r? b?? swpd?? free?? buff? cache?? si?? so??? bi??? bo?? in?? cs us sy id wa st 0? 0????? 0 1681552? 11868? 76840??? 0??? 0??? 50???? 1?? 24?? 25? 0? 0 100? 0? 0? 3. 客戶端1和2先后啟動(dòng),每個(gè)客戶端發(fā)起50000個(gè)長連接,并維持直到服務(wù)端關(guān)閉或超時(shí)。 (pyvenv) $ python?asyncli.py?-c 50000 -k 3600?http://10.211.55.8/?& 4. 約2小時(shí)后。。。查看服務(wù)端 # curl?http://127.0.0.1/nginx_status Active connections: 100001 server accepts handled requests 165539 165539 1095055 Reading: 0 Writing: 1 Waiting: 100000 # ps -p 1899 -o pid,%cpu,%mem,rss,comm PID %CPU %MEM?? RSS COMMAND 1899? 2.0? 4.9 94600 nginx # vmstat 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r? b?? swpd?? free?? buff? cache?? si?? so??? bi??? bo?? in?? cs us sy id wa st 0? 0????? 0 654248? 62920 158924??? 0??? 0???? 6???? 6? 361? 108? 0? 1 98? 0? 0???? 0? 0????? 0 654232? 62920 158952??? 0??? 0???? 0??? 85? 804? 218? 0? 1 98? 0? 0???? 0? 0????? 0 654108? 62928 158976??? 0??? 0???? 0???? 9? 813? 214? 0? 1 98? 0? 0???? 0? 0????? 0 654108? 62928 159004??? 0??? 0???? 0???? 0? 803? 220? 0? 1 99? 0? 0???? ^C # free total?????? used?????? free???? shared??? buffers???? cached Mem:?????? 1918576??? 1264576???? 654000????????? 0????? 62952???? 159112 -/+ buffers/cache:??? 1042512???? 876064 Swap:????? 4128760????????? 0??? 4128760 四 總結(jié) 1. NGINX平均每個(gè)連接的內(nèi)存占用很小,通過ps的rss看出,每個(gè)連接物理內(nèi)存占用約1k。多數(shù)內(nèi)存都被內(nèi)核TCP緩存占用。 2. NGINX維持大量連接(少量活躍連接,本文中平均每秒活躍連接為總連接數(shù)的千分之一)占用很少CPU,上文僅為2%。 3. 最好的優(yōu)化就是不優(yōu)化。整個(gè)測(cè)試除了提升文件數(shù)和連接數(shù)的這些硬限制外,沒有任何參數(shù)調(diào)優(yōu),但仔細(xì)計(jì)算下就發(fā)現(xiàn)平均每個(gè)連接內(nèi)存占用不到10k,遠(yuǎn)小于默認(rèn)的緩存大小(net.ipv4.tcp_rmem = 4096???? 87380???? 4194304)和 (net.ipv4.tcp_wmem = 4096???? 16384???? 4194304) 4. NGINX維持此類連接的主要瓶頸就是可用內(nèi)存大小,我的2GB內(nèi)存虛擬機(jī)其實(shí)可以支持15萬長連接,只不過我物理機(jī)器沒有內(nèi)存再繼續(xù)clone虛擬機(jī)客戶端了:-( 5. 雖然會(huì)遇到更多內(nèi)核參數(shù)的限制,但大內(nèi)存服務(wù)器支持100萬連接是完全沒問題的。?

總結(jié)

以上是生活随笔為你收集整理的NGINX轻松管理10万长连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。