nginx的worker_processes参数
来源: http://bbs.linuxtone.org/thread-1062-1-1.html
分享一:
搜索到原作者的话:
As a general rule you need the only worker with large number of
worker_connections, say 10,000 or 20,000.
However, if nginx does CPU-intensive work as SSL or gzipping and
you have 2 or more CPU, then you may set worker_processes to be equal
to CPU number.
Besides, if you serve many static files and the total size of the files
is bigger than memory, then you may increase worker_processes to
utilize a full disk bandwidth.
Igor Sysoev

一般一个进程足够了,你可以把连接数设得很大。
如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。
或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,
以充分利用IO带宽(主要似乎是IO操作有block)。

根据我配置实践,
服务器是“多个CPU+gzip+网站总文件大小大于内存”的环境,worker_processes设置为CPU个数的两倍比较好。

分享二:
最近PPC经常出现502错误,网页经常无法打开,所以本人决定对Nginx进行深入折腾!
Nginx本身没有挂掉,否则不会出现502的错误信息,所以原因一定在Nginx的设置上。

经过我查阅资料和测试,发现有可能是worker_processes的参数设置不当引起的。

worker_processes默认情况下为1,一般情况下不用修改,但考虑到实际情况,可以修改这个数值,以提高性能;
官方的建议是修改成CPU的内核数,这里引用一段翻译过的文章: 
worker_processes指明了nginx要开启的进程数,
据官方说法,一般开一个就够了,多开几个,可以减少机器io带来的影响。

据实践表明,nginx的这个参数在一般情况下开4个或8个就可以了,再往上开的话优化不太大。
据另一种说法是,nginx开启太多的进程,会影响主进程调度,所以占用的cpu会增高。
经过我测试发现,
这个数字是不能乱设置的,如果网站没有出现io性能问题,最好不要修改,采用默认的1即可,
如果非要设置,必须要和CPU的内核数匹配,否则要么就假死(主要是Windows),要么就出现502的错误(主要是Linux)。

我的电脑是双核的,按理说应该是2,但是实际上应该是4,因为是双线程的。测试结果如下: 
1、worker_processes为1,线程打开2个,有一个是主线程,运行很稳定。
2、worker_processes为2,线程打开3个,有一个是主线程,1分钟左右挂掉
  (假死,无法打开网页,浏览器一直处于载入中)。
3、worker_processes为4,线程打开5个,有一个是主线程,运行很稳定。
4、worker_processes为8,线程打开9个,有一个是主线程,和2一样,1分钟左右挂掉。

配置参考
配置1:
4 CPU (4 Core) + 4 worker_processes (每个worker_processes 使用1个CPU)
[reistlin@reistlin.com ~]$ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

配置2:
​8 CPU (8 Core) + 8 worker_processes (每个worker_processes 使用1个CPU)
[reistlin@reistlin.com ~]$ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
processor : 4
processor : 5
processor : 6
processor : 7

worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

配置3:
​16 CPU (16 Core) + 16 worker_processes (每个worker_processes 使用1个CPU)
[reistlin@reistlin.com ~]$ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
processor : 4
processor : 5
processor : 6
processor : 7
processor : 8
processor : 9
processor : 10
processor : 11
processor : 12
processor : 13
processor : 14
processor : 15

worker_processes 16;
worker_cpu_affinity 
0000000000000001 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000;

Nginx worker_cpu_affinity 设置
根据 Nginx Wiki 上的资料显示:
worker_cpu_affinity
Syntax: worker_cpu_affinity cpumask [cpumask...]
Default: none
Linux only.
With this option you can bind the worker process to a CPU, it calls sched_setaffinity().

For example,
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
Bind each worker process to one CPU only.
worker_processes 2; worker_cpu_affinity 0101 1010;
Bind the first worker to CPU0/CPU2, bind the second worker to CPU1/CPU3. This is suitable for HTT.

worker_cpu_affinity 默认是没有开启的,
根据例子我们可以看得出,0001 0010 0100 1000 分别代表第1、2、3、4个逻辑CPU,
所以我们可以设置0010 0100 1000来将3个进程分别绑定到第2、3、4个逻辑CPU上:
worker_processes 3;
worker_cpu_affinity 0010 0100 1000;
同时根据例子我们也可以看出,
worker_cpu_affinity 可以将同1个进程绑定在2个逻辑CPU上:

worker_processes 2;
worker_cpu_affinity 0101 1010;
0101也就是第1、3个逻辑CPU上,1010就是第2、4个逻辑CPU上。 
 
 
分享三:
worker_processes指明了nginx要开启的进程数,
据官方说法,一般开一个就够了,多开几个,可以减少机器io带来的影响。

据实践表明,nginx的这个参数在一般情况下开4个或8个就可以了,再往上开的话优化不太大。
据另一种说法是,nginx开启太多的进程,会影响主进程调度,所以占用的cpu会增高,
这个说法我个人没有证实,估计他们是开了一两百个进程来对比的吧。

worker_processes配置的一些注意事项:

1、worker_cpu_affinity配置最好是能写上
我这里服务器多数是双核超线程,相当于4cpu,我一般开8进程,所以这个配置就是这样:
worker_cpu_affinity 0001 0100 1000 0010 0001 0100 1000 0010;

另,worker_cpu_affinity不是什么时候都能用的,
我没有认真研究并罗列所有情况,只知道2.4内核的机器用不了,
如果用不了的话,那么最好是加大worker_processes进程数,这样分配cpu就会平均一点啦,
如果不平均只好多重启几下。

2、worker_rlimit_nofile配置要和系统的单进程打开文件数一致,千万不要再画蛇添足地除以worker_processes。
我现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,
总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

转自:http://blog.csdn.net/fireroll/article/details/15756745

nginx的worker_processes优化的更多相关文章

  1. Nginx配置性能优化

    大多数的Nginx安装指南告诉你如下基础知识--通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了.而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能 ...

  2. Nginx配置性能优化(转)

    大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了.而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能 ...

  3. Nginx配置性能优化与压力测试webbench【转】

    这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...

  4. 关于Nginx配置性能优化

    基本的 (优化过的)配置 将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.在服务器的/etc/nginx目录中找到nginx.conf. 首先,我们将谈论一些全局设置,然 ...

  5. Nginx的性能优化

    1.优化worker进程个数: 在高并发.高访问量的WEB服务场景,需要事先启动更多的nginx进程,以保证快速响应并处理大量并发用户的请求,优化nginx进程个数的配置项就是,在nginx.conf ...

  6. Nginx web服务优化 (一)

    1.Nginx基本安全优化 a.更改配置文件参数隐藏版本 编辑nginx.conf配置文件增加参数,实现隐藏Nginx版本号的方式如下.在nginx配置文件nginx.conf中的http标签段内加入 ...

  7. nginx web服务优化

    nginx基本安全优化 1. 调整参数隐藏nginx软件版本号信息 软件的漏洞和版本有关,我们应尽量隐藏或消除web服务对访问用户显示各类敏感信息(例如web软件名称及版本号等信息),这样恶意的用户就 ...

  8. Linux实战教学笔记38:企业级Nginx Web服务优化实战(下)

    四,Nginx站点目录及文件URL访问控制 4.1 根据扩展名限制程序和文件访问 Web2.0时代,绝大多数网站都是以用户为中心多的,例如:bbs,blog,sns产品,这几个产品都有一个共同特点,就 ...

  9. Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

    一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的.因此,我们应尽量隐 ...

随机推荐

  1. HTTP:HTTP清单

    ylbtech-HTTP:HTTP清单 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbt ...

  2. [置顶] getenv、setenv函数(获取和设置系统环境变量) 与 环境变量

    1.getenv() 函数名: getenv 功 能: 从环境中取字符串,获取环境变量的值 头文件: stdlib.h 用 法:char *getenv(char *envvar); 函数说明:get ...

  3. Rails通过页面Debug

    <%= debug(headers) %>--在视图中显示伴随请求的头部信息 <%= debug(params) %>--在视图中显示请求中的参数 <%= debug(a ...

  4. Git学习笔记(四)标签和搭建Git服务

    一.标签是什么 发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一 ...

  5. python web框架 Django基本操作

    django 操作总结! django框架安装: cmd安装: pip3 install django pycharm安装: 在python变量下 搜索 django 安装 创建django项目: c ...

  6. 第十七章 Velocity优化实践(待续)

    现实存在的问题 优化的理论基础 一个高效的模版引擎实现思路 优化成果 其他优化手段

  7. Datapump tips

    同时导出多个schema下的表 $ expdp system/manager dumpfile=test.dmp logfile=test.log directory=TESTDIR schemas= ...

  8. Xcode快捷

  9. python爬虫(4)--Cookie的使用

    Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...

  10. kernel下制作动态logo

    kernel下制作动态logo 在uboot中实现logo的好处是反映速度快. 在kernel中实现logo的好处是,不管是android还是什么其他平台,logo显示无需考虑上层平台. 参照三星平台 ...