+200 동시 연결 후 NGINX 시간 초과 RT

이것은 내 것입니다 nginx.conf(PHP 또는 다른 병목 현상이 없도록 구성을 업데이트했습니다).

user                nginx;
worker_processes    4;
worker_rlimit_nofile 10240;

pid                 /var/run/nginx.pid;

events
{
    worker_connections  1024;
}

http
{
    include             /etc/nginx/mime.types;

    error_log           /var/www/log/nginx_errors.log warn;

    port_in_redirect    off;
    server_tokens       off;
    sendfile            on;
    gzip                on;

    client_max_body_size 200M;

    map $scheme $php_https { default off; https on; }

    index index.php;

    client_body_timeout   60;
    client_header_timeout 60;
    keepalive_timeout     60 60;
    send_timeout          60;

    server
    {
        server_name dev.anuary.com;

        root        "/var/www/virtualhosts/dev.anuary.com";
    }
}

http://blitz.io/play 를 사용하여 서버를 테스트하고 있습니다 (10,000 개의 동시 연결 요금제를 구입했습니다). 30 초 실행, 나는 얻을 964안타를하고 5,587 timeouts. 동시 사용자 수가 200 명일 때 테스트 시간이 40.77 초에 첫 번째 시간 초과가 발생했습니다.

테스트 중 서버로드는 ( top출력) 이었습니다 .

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               20225 nginx     20   0 48140 6248 1672 S 16.0  0.0   0:21.68 nginx
    1 root      20   0 19112 1444 1180 S  0.0  0.0   0:02.37 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 migration/0

따라서 서버 리소스 문제가 아닙니다. 그때는 무엇입니까?

업데이트 2011 12 09 GMT 17:36.

지금까지 병목 현상이 TCP / IP가 아닌지 확인하기 위해 다음과 같이 변경했습니다. 다음에 추가됨 /etc/sysctl.conf:

# These ensure that TIME_WAIT ports either get reused or closed fast.
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
# TCP memory
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 4096

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

더 많은 디버그 정보 :

[root@server node]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 126767
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

NB worker_rlimit_nofile로 설정 10240Nginx의 구성.

업데이트 2011 12 09 GMT 19:02.

변경 사항이 많을수록 더 나빠지는 것처럼 보이지만 여기에는 새 구성 파일이 있습니다.

user                nginx;
worker_processes    4;
worker_rlimit_nofile 10240;

pid                 /var/run/nginx.pid;

events
{
    worker_connections  2048;
    #1,353 hits, 2,751 timeouts, 72 errors - Bummer. Try again?
    #1,408 hits, 2,727 timeouts - Maybe you should increase the timeout?
}

http
{
    include             /etc/nginx/mime.types;

    error_log           /var/www/log/nginx_errors.log warn;

    # http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads/
    access_log              off;

    open_file_cache         max=1000;
    open_file_cache_valid   30s;

    client_body_buffer_size 10M;
    client_max_body_size    200M;

    proxy_buffers           256 4k;
    fastcgi_buffers         256 4k;

    keepalive_timeout       15 15;

    client_body_timeout     60;
    client_header_timeout   60;

    send_timeout            60;

    port_in_redirect        off;
    server_tokens           off;
    sendfile                on;

    gzip                    on;
    gzip_buffers            256 4k;
    gzip_comp_level         5;
    gzip_disable            "msie6";



    map $scheme $php_https { default off; https on; }

    index index.php;



    server
    {
        server_name ~^www\.(?P<domain>.+);
        rewrite     ^ $scheme://$domain$request_uri? permanent;
    }

    include /etc/nginx/conf.d/virtual.conf;
}

업데이트 2011 12 11 GMT 20:11.

이것은 netstat -ntla테스트 중에 출력 됩니다.

https://gist.github.com/d74750cceba4d08668ea

업데이트 2011 12 12 GMT 10:54.

명확히하기 위해 iptables테스트 중에 (방화벽)이 꺼져 있습니다.

업데이트 2011 12 12 GMT 22:47.

이것은 sysctl -p | grep mem덤프입니다.

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
net.ipv4.route.flush = 1
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_max = 8388608
net.core.wmem_default = 65536
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

업데이트 2011 12 12 GMT 22:49

blitz.io모든 테스트를 실행 하는 데 사용 하고 있습니다. 테스트중인 URL 은 다음 명령을 사용하여 http://dev.anuary.com/test.txt입니다 .--region ireland --pattern 200-250:30 -T 1000 http://dev.anuary.com/test.txt

업데이트 2011 12 13 GMT 13:33

nginx사용자 제한 (에서 설정 /etc/security/limits.conf)

nginx       hard nofile 40000
nginx       soft nofile 40000


답변

테스트 중에 네트워크 연결을 덤프해야합니다. 서버에 거의로드가 없을 수 있지만 TCP / IP 스택이 과금 될 수 있습니다. netstat 출력에서 ​​TIME_WAIT 연결을 찾으십시오.

이 경우 TCP 대기 상태, TCP 재 사이클링 및 이와 유사한 메트릭과 관련된 tcp / ip 커널 매개 변수 조정을 점검 할 수 있습니다.

또한 테스트 대상을 설명하지 않았습니다.

나는 항상 테스트 :

  • 정적 컨텐츠 (이미지 또는 텍스트 파일)
  • 간단한 PHP 페이지 (예 : phpinfo)
  • 응용 프로그램 페이지

이것은 귀하의 경우에는 적용되지 않을 수 있지만 성능 테스트시 수행하는 작업입니다. 다른 유형의 파일을 테스트하면 봇 틀넥을 정확히 찾아 낼 수 있습니다.

정적 콘텐츠의 경우에도 시간 초과 및 기타 메트릭을 다이얼링하려면 다른 크기의 파일을 테스트하는 것이 중요합니다.

3000 개 이상의 활성 연결을 처리하는 정적 콘텐츠 Nginx 상자가 있습니다. Nginx가 확실히 할 수 있습니다.

업데이트 : netstat에 많은 열린 연결이 표시됩니다. TCP / IP 스택 조정을 시도 할 수 있습니다. 또한 어떤 파일을 요청하고 있습니까? Nginx는 포트를 빠르게 닫아야합니다.

sysctl.conf에 대한 제안은 다음과 같습니다.

net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

이 값은 매우 낮지 만 동시성 Nginx 상자에서 성공했습니다.


답변

또 다른 가설. 을 늘 worker_rlimit_nofile렸지만 최대 클라이언트 수는 설명서에서 다음 과 같이 정의 됩니다.

max_clients = worker_processes * worker_connections

worker_connections8192와 같이 올리려고하면 어떻게합니까? 또는 CPU 코어가 충분하면 worker_processes?


답변

나는 아파치 서버의 업스트림에서로드 밸런서 역할을하는 nginx 상자와 매우 비슷한 문제가있었습니다.

필자의 경우 업스트림 아파치 서버가 오버로드되어 네트워킹과 관련된 문제를 격리 할 수있었습니다. 전체 시스템이로드되는 동안 간단한 bash 스크립트로 다시 만들 수 있습니다. 중단 된 프로세스 중 하나의 strace에 따르면 연결 호출에 ETIMEDOUT이 발생했습니다.

이 설정 (nginx 및 업스트림 서버)은 문제를 해결했습니다. 이러한 변경을 수행하기 전에 분당 1 ~ 2 시간 초과가 발생하고 (~ 100 reqs / s를 처리하는 상자) 이제 0을 얻습니다.

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 400000
net.core.somaxconn = 4096

net.ipv4.tcp_tw_recycle 또는 net.ipv4.tcp_tw_reuse를 사용하지 않는 것이 좋지만 후자를 사용하려면 후자를 사용하십시오. 대기 시간이 전혀없고 후자가 적어도 둘 중 더 안전하면 기괴한 문제가 발생할 수 있습니다.

tcp_fin_timeout을 1로 설정하면 문제가 발생할 수 있다고 생각합니다. 기본값보다 훨씬 낮은 20/30에 배치하십시오.


답변

blitz.io에서 테스트하는 동안 nginx 문제가 아닐 수도 있습니다.

tail -f /var/log/php5-fpm.log

(저는 PHP를 처리하는 데 사용하는 것입니다)

오류가 발생하고 시간 초과가 발생하기 시작합니다.

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

따라서 fmp conf에 max_children을 더 많이 넣으십시오! ;디


답변

너무 낮습니다 max open files(1024). nginx를 변경하고 다시 시작하십시오. ( cat /proc/<nginx>/limits확인)

ulimit -n 10240

그리고 worker_connections10240 이상으로 늘리십시오 .