设置worker_processes
一般来说,拥有几个逻辑CPU,就设置为几个worker_processes 为宜,但是worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了
查看逻辑CPU数量:cat /proc/cpuinfo | grep "processor" | wc -l
设置worker_cpu_affinity
Nginx默认没有开启利用多核cpu,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu的性能。cpu是任务处理,计算最关键的资源,cpu核越多,性能就越好
示例:8核CPU,nginx配置信息:
worker_processes 8;worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;CPU工作状况:(输入 top 后,按1 查看)
top - 11:16:56 up 39 days, 1:16, 2 users, load average: 0.09, 0.07, 0.10Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombieCpu0 : 0.0%us, 0.0%sy, 0.0%ni, 95.1%id, 0.0%wa, 0.0%hi, 0.0%si, 4.9%stCpu1 : 0.0%us, 0.0%sy, 0.0%ni, 98.8%id, 0.0%wa, 0.0%hi, 0.0%si, 1.2%stCpu2 : 2.3%us, 0.0%sy, 0.0%ni, 92.8%id, 0.0%wa, 0.0%hi, 0.0%si, 4.9%stCpu3 : 4.6%us, 9.2%sy, 0.0%ni, 81.2%id, 0.0%wa, 0.0%hi, 0.0%si, 5.0%stCpu4 : 1.9%us, 0.0%sy, 0.0%ni, 96.1%id, 0.0%wa, 0.0%hi, 0.0%si, 1.9%stCpu5 : 0.0%us, 0.0%sy, 0.0%ni, 98.1%id, 0.0%wa, 0.0%hi, 0.0%si, 1.9%stCpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu7 : 0.0%us, 0.0%sy, 0.0%ni, 96.9%id, 0.0%wa, 0.0%hi, 0.0%si, 3.1%stMem: 1024884k total, 891244k used, 133640k free, 144852k buffersSwap: 262140k total, 4172k used, 257968k free, 434072k cached上面的配置表示:8核CPU,开启8个进程。00000001表示开启第一个cpu内核,00000010表示开启第二个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
设置worker_rlimit_nofile
worker_rlimit_nofile 65535;
这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。 现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。 查看linux系统文件描述符的方法:[root@web001 ~]# sysctl -a | grep fs.filefs.file-max = 789972fs.file-nr = 510 0 789972
Events模块配置
events { worker_connections 65535; multi_accept on; use epoll; }worker_connections 每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections 。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高(一般和worker_rlimit_nofile一样就可以)。 记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。
multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。
use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。 (值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)补充说明:
与apache相类,nginx针对不同的操作系统,有不同的事件模型 A)标准事件模型 Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll B)高效事件模型 Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。 Epoll: 使用于Linux内核2.6版本及以后的系统。 /dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装安全补丁。