WebSocket輕鬆單臺服務器5w併發jmeter實測

測試結論

  1. nginx最多隻能維持(65535*後端服務器IP個數)條websocket的長鏈接,若是後端websocket服務器IP只有一個,那麼就只能最多支持65535條鏈接。瓶頸就產生在了nginx上
  2. 建議採用LVS的DR模式來作負載均衡,這樣最大長鏈接數目就只和websocket服務器資源(主要是內存)有關了,單臺websocket服務器很輕鬆能夠支撐百萬級鏈接

websocket 相關配置

<Connector port="9999"  protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" acceptCount="150000"
                  maxThreads="2000" maxConnections="150000" enableLookups="false"  redirectPort="8443"  />
複製代碼
  • connectionTimeout——默認設置爲20秒。經過修改該參數,能夠修改tomcat的請求超時時間html

  • acceptCount——當tomcat的線程數達到maxThreads後,新的請求就會排隊等待,超過排隊數的請求會被拒絕,acceptCount最好大於等於maxThreadslinux

  • maxThreads:nginx

    (1)、部署的程序偏計算型,主要利用cpu資源,應該將該參數設置小一點,減少同一時間搶佔cpu資源的線程個數。 (2)、部署的程序對io、數據庫佔用時間較長,線程處於等待的時間較長,應該將該參數調大一點,增長處理個數。web

  • maxConnections——這個值表示最多能夠有多少個socket鏈接到tomcat上。NIO模式下默認是10000數據庫

  • enableLookups——爲了消除DNS查詢對性能的影響咱們能夠關閉DNS查apache

Nginx

location ^~ /wnhz/websocket/ {
            proxy_connect_timeout 60s;——該指令設置與upstream server的鏈接超時時間,有必要記住,這個超時不能超過75秒
            proxy_read_timeout 3600s;——該指令設置與代理服務器的讀超時時間。它決定了nginx會等待多長時間來得到請求的響應。這個時間不是得到整個response的時間,而是兩次reading操做的時間
            proxy_send_timeout 60s; ——這個指定設置了發送請求給upstream服務器的超時時間。超時設置不是爲了整個發送期間,而是在兩次write操做期間。若是超時後,upstream沒有收到新的數據,nginx會關閉鏈接
             proxy_http_version 1.1;——支持websocket
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
             proxy_set_header Host $host;
               proxy_pass http://test/websocket/;
    }
    ---------------------   官方配置--------------------------------------
    location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
複製代碼

用nginx作websocket的反向代理資源瓶頸原理

  1. 內存(相關數據結構的存儲)、cpu、網絡
內存的佔用分兩部分,一部分是內核中tcp協議棧結構佔用的內存,一部分是nginx中維持雙向鏈接數據結構佔用的內存

按照理想情況,一條tcp鏈接的數據結構在內存中佔用大約4KB左右,nginx的內存佔用,沒有統計相關的結構體,這裏就等於2KB(nginx的內存利用很是高效,有內存池)

對於如今的服務器來講內存、cpu、網絡都不會是瓶頸,所以這裏不作討論
複製代碼
  1. 文件描述符數量
可能須要調整內核參數,文件描述符的數量其實也是和內存相關的,由於每打開一個tcp鏈接,就得佔用一個文件描述符。

內核參數:fs.file-max

這是和系統資源相關的,也不會是瓶頸
複製代碼
  1. 端口號數量
內核參數爲:net.ipv4.ip_local_port_range,且最大值爲65535

linux內核是經過{local_ip, local_port, remote_ip, remote_port}這個四元組來標識一條惟一的tcp鏈接的。

1)對於websocket服務器自身而言,local_ip, local_port是肯定的,在內存、cpu足夠的狀況下,其能夠支撐 (client_ip數量*2^16)條鏈接。也就是說只要服務器資源足夠,必定不會是瓶頸。

2)對於nginx服務器來講,local_ip, local_port也是肯定的,不一樣的是,它還要做爲client去鏈接websocket服務器,這是要佔用一個端口的。

所以,nginx能支撐的websocket鏈接數最大爲:(代理的websocket服務器IP數量*2^16),若是隻有一個websocket服務器IP,那麼就只有65536,去掉0端口,就只有65535.
複製代碼

Linux測試5wWebSocket鏈接

百度介紹相關可自行測試。後端

相關文章
相關標籤/搜索