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等待状态,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盒子上取得了成功.