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


12

이것은 내 것입니다 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

당신은 이것을 직접 호스팅하고 있습니까? 서버 앞에로드 밸런서 또는 이와 유사한 것이 없습니까? ISP에서 DDoS 공격으로 탐지하여 다운시킬 수있는 것이 있습니까?
바트 실버 스트림

예, 이것은 내 서버입니다. ovh.co.uk/dedicated_servers/eg_ssd.xml DDoS 공격을 차단할 수있는 것은 없습니다. 또한로 증가 worker_processes했습니다 4.
Gajus

방금 OVH에 연락하여 서버에 구현 된 네트워크 수준 보안이 없는지 다시 확인했습니다. 없습니다.
Gajus

어떤 종류의 데이터를 제공합니까? html, 이미지 등?
pablo December

1
nginx 구성을 배제하기 위해 로컬 벤치 마크를 실행하는 것이 도움이 될 것이라고 생각합니다. 그렇지 않습니까?
3molo

답변:


2

테스트 중에 네트워크 연결을 덤프해야합니다. 서버에 거의로드가 없을 수 있지만 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 상자에서 성공했습니다.


UPDATE 2011 12 09 GMT 17:36.
Gajus

코드로 인해 기본 회신에 업데이트가 추가되었습니다.
jeffatrackaid

테스트 중에 완전한 상단 출력을 추가하십시오. CPU nginx가 얼마나 많은 양을 사용하고 있는지 확인해서는 안됩니다.
Giovanni Toraldo

1
net.ipv4.tcp_tw_recycle = 1을 사용할 때주의하십시오 : 일반적으로 말하면 : 좋은 생각이 아닙니다. 재사용은 괜찮습니다.
anonymous-one

localhost 대신 Linux 소켓을 사용하지 않는 이유는 무엇입니까?
BigSack

1

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

max_clients = worker_processes * worker_connections

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


1

나는 아파치 서버의 업스트림에서로드 밸런서 역할을하는 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에 배치하십시오.


0

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을 더 많이 넣으십시오! ;디


return 200 "test"NGINX에 있으면 문제가 동일합니다 . 이것은 NGINX가 PHP-FPM을 호출 할 때까지 진행되지 않는다는 것을 의미합니다.
Gajus

0

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

ulimit -n 10240

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


왜 이것이 투표에 실패했는지 잘 모르겠습니다. 나에게 정답 인 것 같습니다.
Ryan Angilly 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.