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链接

百度介绍相关可自行测试。后端

相关文章
相关标签/搜索