Nginx充分利用多核CPU提升性能_配置参数worker_cpu_affinity及PHP对多核心的利用之充分利用多核CPU,加速你的PHP应用(非web)

jackxiang 2011-12-13 13:33 | |
我的4核心开8个进程:

[root@jackxiang conf]# ps aux|grep nginx
root     30054  0.1  0.0 308184  1740 ?        Ss   20:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
www      30060  3.6  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process                                          
www      30062  3.5  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process                                          
www      30063  4.1  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process                                          
www      30064  3.8  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process                                          
www      30065  3.8  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process                                          
www      30066  3.5  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process                                          
www      30067  4.6  0.4 329396 24180 ?        S    20:44   0:00 nginx: worker process                                          
www      30068  4.1  0.3 329396 23208 ?        S    20:44   0:00 nginx: worker process
2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
——————————————————————————————————————————————————————————————————————————
我的双核cpu开两个进程,为

worker_processes     2;  
worker_cpu_affinity 01 10;  

若要2核CPU开4进程,那么可以写为:
worker_processes     4;  
worker_cpu_affinity 01 10 01 10;
——————————————————————————————————————————————————————————————————————————
Nginx默认没有开启利用多核CPU,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU。CPU是任务处理,计算最关键的资源,CPU核越多,性能就越好。
下面直接上示例
1. 2核CPU,开启2个进程
worker_processes     2;
worker_cpu_affinity 01 10;
01表示启用第一个CPU内核,10表示启用第二个CPU内核
worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。
2. 2核CPU,开启4个进程
worker_processes     4;
worker_cpu_affinity 01 10 01 10;
开启了四个进程,它们分别对应着开启2个CPU内核
3. 4核CPU,开户4个进程
worker_processes     4;
worker_cpu_affinity 0001 0010 0100 1000;
0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
4. 4核CPU,开启2个进程
worker_processes     2;
worker_cpu_affinity 0101 1010;
0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核
2个进程对应着四个内核
worker_cpu_affinity配置是写在/etc/nginx/nginx.conf里面的。
2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
配置完毕后,重启nginx ,执行/etc/init.d/nginx restart
测试nginx是否有用到多个CPU内核 ,在另一台机器上执行ab.exe -c 1000 -n 1000 http://www.domain.com/index.php
ab.exe是装apache后带的一个性能测试工具,它可以模拟多客户端的并发请求。
在服务器上执行top,然后按1,就可以看到CPU内核的工作情况。如果多个CPU内核的利用率都相差不多,证明nginx己经成功的利用了多核CPU。
测试结束后,CPU内核的负载应该都同时降低。

==========================================================================
现在大概已经很难找到单核心的服务器了吧,就连大多数近现代PC也都有了2个以上的CPU核心。

由于工作需要,常常要运行一些大数据量和大运算量的PHP脚本。在这种情况下,充分利用多核心的运算能力就显得非常有意义。

需要说明的是,下面的方法对于PHP的web应用并不适用,因为web方式运行的时候依赖于web服务器的工作模式。或许独立进程的cgi/fcgi是可以用的,但一般常见的php_mod形式是不适用的。

下面是两个脚本:task.php模拟一个需要长期执行的任务,run.php则是对task.php的启动和调度管理

task.php

<?php

$s = $argv[1];

while(1) {

    sleep(3);

    echo "$s " . time() . " \n";

}

run.php

<?php
for($i=0;$i<4;$i++) popen("nohup taskset -c $i php task.php $i 2>&1 >> /tmp/mcpu.log &",'r');
运行run.php,检查一下是否符合我们的期望

alix@alix-laptop:~$ ps -eo pid,args,psr | grep ph[p]

6771 php task.php 0                0

6773 php task.php 1                1

6775 php task.php 2                2

6777 php task.php 3                3

看起来是对的,4个进程分别运行在4个核心上了。

需要你自己研究的问题:
1. taskset是什么?有没有php的函数可以做到同样的事情?
2. 为什么是popen而不是反引号或exec等函数,如果需要双向的管道应该怎么办?
3. 多核心并行运算有什么需要在开发时特别注意的?

4. 多进程之间如何互相通讯?如何划分任务来做到并行?

来源:http://blog.netroby.com/article-3523.html
http://hi.baidu.com/aolaii/blog/item/e906fbf2d7eadc01b17ec537.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/4843/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2016-8-5 19:37
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]