Welcome! Log In Create A New Profile

Advanced

Балансировка с большой нагрузкой

December 28, 2010 10:19AM
Тестирую jboss кластер из двух нод (ноды на разных машинах, windows xp, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
--> MaxUserPort = 65000
--> TcpTimedWaitDelay = 30)

На третьей машине Intel Xeon E5335 @ 2.00 GHz с операционной системой centos установлен nginx.0.8.53-1.e15 в качестве балансировщика.

На четвёртой машине java1.5.0_22 HttpClient3.1 c MultiThreadedHttpConnectionManager'ом, который шарится на "большое" кол-во потоков - от 2 до 10 тысяч.

На каждую jboss ноду задеплоен ear с web фасетом, который ловит запросы со от балансировщика, перенаправляет в stateless бин, который отвечает определённым образом, понятным для клиента. Конфиг коннектора из server.xml:

<Connector protocol="HTTP/1.1" port="8070" address="${jboss.bind.address}"
maxThreads="5000" connectionTimeout="20000" redirectPort="8443"
backlog="15000" bufferSize="10000" deferAccept="false" tcpNoDelay="true"/>

Сразу хочу сказать, что если нагружать nginx, который работает не в режиме балансировшика, т.е. у него отсутствует директива upstream, то ошибок не наблюдается.. но когда подключаешь backend..

-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
nginx.conf
-----------------------------------------------------------------------------------

worker_processes 10;
worker_priority -10;
worker_rlimit_nofile 100000;

events {
worker_connections 1024;
use epoll;
}

http {
keepalive_timeout 0;
connection_pool_size 4096;
request_pool_size 8k;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
tcp_nodelay on;

upstream localhost {
server 192.168.2.18:8070;
server 192.168.2.203:8070;
}

server {
listen 8090 backlog=15000;
server_name localhost;

location / {
proxy_pass http://localhost;

proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;

proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

proxy_temp_path /var/nginx/proxy_temp;

}
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
/etc/sysctl.conf
-----------------------------------------------------------------------------------

fs.file-max = 999999
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_rmem = 4096 16777216 16777216
net.ipv4.tcp_wmem = 4096 16777216 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_conntrack_max = 1500000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_max_tw_buckets = 1800000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 10000
net.ipv4.tcp_keepalive_time = 3600
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 60
net.ipv4.netfilter.ip_conntrack_udp_timeout = 10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1200
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 10
net.ipv4.netfilter.ip_conntrack_generic_timeout = 180
net.ipv4.netfilter.ip_conntrack_tcp_be_liberal = 1
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 15
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 60
net.ipv4.netfilter.ip_conntrack_max = 1500000
net.core.somaxconn = 262144

Хочу заметить, что параметры приведённые выше, были использованы не всегда осознанно, но опытным путём установлены те, которые влияют точно:

server.xml
---
maxThreads, tcpNoDelay="true", backlog

nginx.conf
-----
listen 8090 backlog=15000;
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;

sysctl.conf
----
net.core.somaxconn

В чём собственно проблема? Проблема в том, что когда я включаю на клиенте например 4000 потоков, т.е. параллельных сессий, то получаю примерно 400 ошибок на клиенте "read timed out", что говорит о том, что клиент не может дождаться на nginx результата работы backend'а (хотя keepalive_timeout 0) и около 600 ошибок типа "The page is temporarily unavailable" -не знаю что это такое, может проблемы с сокетами, может очередь сообщений на жибосовских томкатах переполняется, хотя если я увеличиваю backlog="30000" bufferSize="30000", то ошибок становится ещё больше.

С апачем было гораздо меньше ошибок.

Уж не знаю чё и делать дальше, может попробовать подключить к nginx модуль UpstreamFair и перенести backend на линуксы?

Спасибо
Subject Author Posted

Балансировка с большой нагрузкой

alexander-k December 28, 2010 10:19AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 233
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready