centos – 200个并发连接后NGINX超时

这是我的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次超时.当并发用户数为200时,第一次超时发生在测试的40.77秒.

在测试期间,服务器负载是(最高输出):

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

注意,worker_rlimit_nofile设置为10240 nginx config.

更新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,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格林威治标准时间10:54.

只是为了澄清,iptables(防火墙)在测试时关闭了.

更新2011 12 12 GMT 22:47.

这是sysctl -p | grep mem dump.

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)
>申请页面

这可能不适用于您的情况,但是我在性能测试时会这样做.测试不同类型的文件可以帮助您查明瓶颈.

即使使用静态内容,测试不同大小的文件也很重要,以便获得超时和其他指标.

我们有一些静态内容Nginx盒子处理3000个活动连接.所以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盒子上取得了成功.

相关文章

#使用军哥的lnmp配置虚拟主机,需要注意的是要配置hosts文件(...
一、配置编译环境 yum update &amp;&amp; yum upgra...
一、下载repo文件 二、备份并替换系统的repo文件 三、执行yu...
LAMP -- Linux Apache MySQL PHP 在CentOS安装的顺序,我一般...
一、下载nginx安装包,官网下载中心http://nginx.org/downlo...
1.下载composer curl -sS https://getcomposer.org/installe...