Заключение теста
- Nginx может поддерживать только (65535 * количество IP-адресов внутренних серверов) длинные соединения через веб-сокеты.Если есть только один IP-адрес внутреннего веб-сервера, он может поддерживать только до 65535 соединений. Узкое место генерируется на nginx
- Рекомендуется использовать режим DR LVS для балансировки нагрузки, чтобы максимальное количество длинных соединений было связано только с ресурсами сервера веб-сокетов (в основном с памятью).Один сервер веб-сокетов может легко поддерживать миллионы соединений.
конфигурация, связанная с веб-сокетом
<Connector port="9999" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" acceptCount="150000"
maxThreads="2000" maxConnections="150000" enableLookups="false" redirectPort="8443" />
-
connectionTimeout — значение по умолчанию — 20 секунд. Изменяя этот параметр, вы можете изменить время ожидания запроса tomcat.
-
acceptCount — когда количество потоков в tomcat достигает maxThreads, новые запросы будут поставлены в очередь, а запросы, превышающие количество очередей, будут отклонены.AcceptCount желательно должен быть больше или равен maxThreads
-
МаксТредс:
(1) Развернутая программа основана на вычислениях и в основном использует ресурсы ЦП.Этот параметр следует установить меньше, чтобы уменьшить количество потоков, которые одновременно вытесняют ресурсы ЦП. (2) Развернутая программа занимает много времени для ввода-вывода и базы данных, а поток долго ждет. Параметр следует увеличить, чтобы увеличить количество обработок.
-
maxConnections — это значение указывает, сколько сокетов может быть подключено к tomcat максимум. По умолчанию 10000 в режиме NIO.
-
enableLookups — чтобы исключить влияние поиска DNS на производительность, мы можем отключить поиск DNS.
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
- память (хранение связанных структур данных), процессор, сеть
内存的占用分两部分,一部分是内核中tcp协议栈结构占用的内存,一部分是nginx中维持双向连接数据结构占用的内存
按照理想状况,一条tcp连接的数据结构在内存中占用大约4KB左右,nginx的内存占用,没有统计相关的结构体,这里就等于2KB(nginx的内存利用非常高效,有内存池)
对于现在的服务器来说内存、cpu、网络都不会是瓶颈,因此这里不做讨论
- количество файловых дескрипторов
可能需要调整内核参数,文件描述符的数量其实也是和内存相关的,因为每打开一个tcp连接,就得占用一个文件描述符。
内核参数:fs.file-max
这是和系统资源相关的,也不会是瓶颈
- количество портов
内核参数为: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
Байду введениеПопробуй себя.