Nginx充分利用多核CPU提升性能_配置参数worker_cpu_affinity及PHP对多核心的利用之充分利用多核CPU,加速你的PHP应用(非web)
我的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
[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
评论列表