nginx高并发优化——轻松应对1万并发

By | 2018年4月17日
测试机器512M内存,swap分区407M ,centos6.5,nginx1.10.1,php5.6
默认的Linux内核参数和nginx参数考虑的是最通用场景,不适合高并发
所以优化思路主要包括两个层面:系统层面+nginx层面

一、系统层面
1、调整同时打开文件数量
ulimit -n 20480
2、TCP最大连接数(somaxconn)
echo 10000 > /proc/sys/net/core/somaxconn
3、TCP连接立即回收、回用(recycle、reuse)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
4、不做TCP洪水抵御
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
也可以直接使用优化后的配置,在/etc/sysctl.conf中加入:
net.core.somaxconn = 20480
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.tcp_syncookies = 0
使用:sysctl -p 生效
sysctl -p

二、nginx层面
修改nginx配置文件,nginx.conf
增加work_rlimit_nofile和worker_connections数量,并禁用keepalive_timeout。
worker_processes  1; #nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数
worker_rlimit_nofile 20000; #一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致
events {
use epoll;#使用epoll的I/O模型
worker_connections 20000;#每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
multi_accept on;
}
http {
keepalive_timeout 0;
}

三、测试
重启nginx
service nginx restart

使用ab压力测试

  1. D:\phpStudy\Apache\bin>ab -r -n 150000  -c 10000 http://192.168.1.198/msg.php
  2. This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
  4. Licensed to The Apache Software Foundation, http://www.apache.org/
  5. Benchmarking 192.168.1.198 (be patient)
  6. Completed 15000 requests
  7. Completed 30000 requests
  8. Completed 45000 requests
  9. Completed 60000 requests
  10. Completed 75000 requests
  11. Completed 90000 requests
  12. Completed 105000 requests
  13. Completed 120000 requests
  14. Completed 135000 requests
  15. Completed 150000 requests
  16. Finished 150000 requests
  17. Server Software:        nginx/1.10.1
  18. Server Hostname:        192.168.1.198
  19. Server Port:            80
  20. Document Path:          /msg.php
  21. Document Length:        955 bytes
  22. Concurrency Level:      10000
  23. Time taken for tests:   553.886 seconds
  24. Complete requests:      150000
  25. Failed requests:        74065
  26.    (Connect: 0, Receive: 0, Length: 74065, Exceptions: 0)
  27. Non-2xx responses:      74065
  28. Total transferred:      108769526 bytes
  29. HTML transferred:       85048014 bytes
  30. Requests per second:    270.81 [#/sec] (mean)
  31. Time per request:       36925.756 [ms] (mean)
  32. Time per request:       3.693 [ms] (mean, across all concurrent requests)
  33. Transfer rate:          191.77 [Kbytes/sec] received
  34. Connection Times (ms)
  35.               min  mean[+/-sd] median   max
  36. Connect:        0    1  19.0      1    3004
  37. Processing:   332 33370 25597.6  31689   92093
  38. Waiting:      163 32879 25640.0  31420   91598
  39. Total:        332 33370 25597.5  31689   92093
  40. Percentage of the requests served within a certain time (ms)
  41.   50%  31689
  42.   66%  60464
  43.   75%  60730
  44.   80%  60928
  45.   90%  61319
  46.   95%  61790
  47.   98%  62191
  48.   99%  62640
  49.  100%  92093 (longest request)
  50. D:\phpStudy\Apache\bin>

如果不优化,运行时间超过半个小时!!!

  1. ab -r -n 150000  -c 10000 http://192.168.1.198/msg.php
  2. This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
  4. Licensed to The Apache Software Foundation, http://www.apache.org/
  5. Benchmarking 192.168.1.198 (be patient)
  6. Completed 15000 requests
  7. Completed 30000 requests
  8. Completed 45000 requests
  9. Completed 60000 requests
  10. Completed 75000 requests
  11. Completed 90000 requests
  12. Completed 105000 requests
  13. Completed 120000 requests
  14. Completed 135000 requests
  15. Completed 150000 requests
  16. Finished 150000 requests
  17. Server Software:        nginx/1.10.1
  18. Server Hostname:        192.168.1.198
  19. Server Port:            80
  20. Document Path:          /msg.php
  21. Document Length:        955 bytes
  22. Concurrency Level:      10000
  23. Time taken for tests:   3136.477 seconds
  24. Complete requests:      150000
  25. Failed requests:        0
  26. Total transferred:      168150000 bytes
  27. HTML transferred:       143250000 bytes
  28. Requests per second:    47.82 [#/sec] (mean)
  29. Time per request:       209098.485 [ms] (mean)
  30. Time per request:       20.910 [ms] (mean, across all concurrent requests)
  31. Transfer rate:          52.35 [Kbytes/sec] received
  32. Connection Times (ms)
  33.               min  mean[+/-sd] median   max
  34. Connect:        0   20 236.9      1    3045
  35. Processing:  4178 202109 29524.0 208780  220830
  36. Waiting:     1246 105285 59956.2 104752  216204
  37. Total:       4179 202129 29523.9 208806  220831
  38. Percentage of the requests served within a certain time (ms)
  39.   50%  208806
  40.   66%  210991
  41.   75%  211892
  42.   80%  212733
  43.   90%  213611
  44.   95%  214917
  45.   98%  217376
  46.   99%  217451
  47.  100%  220831 (longest request)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注