NGINX輕鬆管理10萬長串連 --- 基於2GB記憶體的CentOS 6.5 x86-64

來源:互聯網
上載者:User

標籤:

 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854

一 前言 當管理大量串連時,特別是只有少量活躍串連,NGINX有比較好的CPU和RAM利用率,如今是多終端保持線上的時代,更能讓NGINX發揮這個優點。本文做一個簡單測試,NGINX在一個普通PC虛擬機器上維護100k的HTTP長串連,然後查看NGINX和系統的資源使用率。 二 測試環境  1.服務端 硬體:雙核2.3GHz,2GB記憶體軟體:CentOS 6.5, kernel 2.6.32,  gcc 4.4.7, nginx 1.4.7IP:10.211.55.8 核心參數調整:
$ /sbin/sysctl -w net.netfilter.nf_conntrack_max=102400 # 提升系統整體串連數$ /sbin/sysctl net.netfilter.nf_conntrack_max #驗證是否生效 NGINX從源碼編譯時間帶--with-http_stub_status_module,只列出與預設設定不同的部分:
worker_rlimit_nofile 102400;events {    worker_connections  102400;}http {       # 設一個比較大得逾時,用戶端能以平緩的方式發送HEAD請求來維持KeepAlive       keepalive_timeout  3600;         #監控串連數,本機訪問        location /nginx_status {            stub_status on;            access_log   off;            allow 127.0.0.1;            deny all;        }}   2. 用戶端1 硬體:雙核2.3GHz,2GB記憶體軟體:CentOS 6.5, kernel 2.6.32, gcc 4.4.7, Python 3.3.5IP:10.211.55.9 核心參數調整:$ /sbin/sysctl -w net.ipv4.ip_local_port_range="1024 61024” #實際只使用50000個連接埠$ /sbin/sysctl net.ipv4.ip_local_port_range #驗證是否生效$ vi /etc/security/limits.conf #提升目前使用者的最大開啟檔案數nofile(hard >= soft > 50000)$ ulimit -n #驗證是否生效,可能需重啟shell Python 3.3.5從源碼編譯,如下配置:$ pyvenv ~/pyvenv #建立虛擬環境,便於測試$ . ~/pyvenv/bin/activate #啟用虛擬環境(pyvenv) $ python get-pip.py #從pip官網下載get-pip.py(pyvenv) $ pip install asyncio #安裝非同步IO模組 因為Apache ab只能批量請求,不能維持串連,所以自己寫了一個HTTP長串連測試載入器asyncli.py,詳細實現見http://blog.chinaunix.net/uid-190176-id-4223282.html。基本用法:(pyvenv) $ python asyncli.py --helpusage: 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 工作機制:每隔10毫秒連續建立10個串連(每秒約1000個串連),直到總串連數達到CONNECTIONS,每個串連都會睡眠[1, KEEPALIVE / 2]的一個隨機數(單位為秒),然後向服務端url發送一個HEAD請求來維持HTTP KeepAlive,然後重複上一個睡眠步驟。。。  3. 用戶端2 與用戶端1完全一致,除了IP為10.211.55.10 三 運行與輸出  1. 服務端系統空閑# vmstatprocs -----------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. 服務端啟動NGINX,無外部WEB請求# nginx# vmstatprocs -----------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先後啟動,每個用戶端發起50000個長串連,並維持直到服務端關閉或逾時。(pyvenv) $ python asyncli.py -c 50000 -k 3600 http://10.211.55.8/ &  4. 約2小時後。。。查看服務端# curl http://127.0.0.1/nginx_statusActive connections: 100001server accepts handled requests 165539 165539 1095055Reading: 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 3procs -----------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     cachedMem:       1918576    1264576     654000          0      62952     159112-/+ buffers/cache:    1042512     876064Swap:      4128760          0    4128760 四 總結  1. NGINX平均每個串連的記憶體佔用很小,通過ps的rss看出,每個串連實體記憶體佔用約1k。多數記憶體都被核心TCP緩衝佔用。 2. NGINX維持大量串連(少量活躍串連,本文中平均每秒活躍串連為總串連數的千分之一)佔用很少CPU,上文僅為2%。 3. 最好的最佳化就是不最佳化。整個測試除了提升檔案數和串連數的這些硬限制外,沒有任何參數調優,但仔細計算下就發現平均每個串連記憶體佔用不到10k,遠小於預設的緩衝大小(net.ipv4.tcp_rmem = 4096     87380     4194304)和 (net.ipv4.tcp_wmem = 4096     16384     4194304) 4. NGINX維持此類串連的主要瓶頸就是可用記憶體大小,我的2GB記憶體虛擬機器其實可以支援15萬長串連,只不過我物理機器沒有記憶體再繼續clone虛擬機器用戶端了:-( 5. 雖然會遇到更多核心參數的限制,但大記憶體伺服器支援100萬串連是完全沒問題的。

NGINX輕鬆管理10萬長串連 --- 基於2GB記憶體的CentOS 6.5 x86-64

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.