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

alexander-k nginx-forum на nginx.us
Вт Дек 28 18:19:18 MSK 2010


Тестирую 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:

      

Сразу хочу сказать, что если нагружать
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 на линуксы?

Спасибо

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,161726,161726#msg-161726




Подробная информация о списке рассылки nginx-ru