nginx + fastcgi

如何使nginx代理php在所有内核上均匀加速。

当我试图强调testingconfiguration时,Top显示仅使用2个内核。

Cpu0 : 62.6%us, 14.9%sy, 0.0%ni, 18.5%id, 0.3%wa, 0.0%hi, 3.6%si, 0.0%st Cpu1 : 57.1%us, 11.0%sy, 0.0%ni, 31.2%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st Cpu2 : 1.3%us, 0.7%sy, 0.0%ni, 97.0%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st Cpu3 : 2.0%us, 1.7%sy, 0.0%ni, 95.7%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st 

我有

 worker_processes 20; 

在nginx.conf中设置

快速启动cgi

 spawn-fcgi -s /tmp/php.sock -f /usr/sbin/php -u nobody -g nogroup -U nobody -G nogroup -C 160 -P /var/run/spawn-fcgi.pid 

在nginx.conf中调用fast cgi的代理块是

 location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php.sock; fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; } 

将nginx工作进程设置为20是不必要的。 有了四个CPU核心,没有理由把它设置为高于4.即使你有更多的CPU核心,你可能不会从这个更高的设置中受益 。

除了设置你的nginx进程太高,你可能会把你的fastcgi进程设置得太高。 160是很多。 除非你的PHP代码花费了很多时间在缓慢的资源上等待,否则我怀疑你真的想要一次处理160个FastCGI请求。 由于您只有4个核心,这将使每个请求花费更长的时间来完成。

我不确定你为什么认为你的CPU没有被有效利用。 看看你的最高产出,最繁忙的两个核心仍然闲置20%和30%的时间。 这可能意味着PHP只需要将请求一次传递给两个FastCGI进程以跟上负载,或者这意味着它可以处理多达160个并发请求,但不需要太多CPU时间(例如他们正在networking或磁盘上等待)。 无论哪种方式,如果所有四个核心的工作已经更均匀地展开,那么它将不会更快完成。

尽pipe我不推荐它,但是可以使用taskset强制进程在特定内核上运行。 基本语法是tasket -c $CPU_LIST -p $PID 。 EG要确保进程17325只能在第一个CPU内核上运行,您需要运行cpuset -c 0 -p 17325 。 这种function没有被集成到spawn-fcgi中,而且由于PHP进程会在PHP_FCGI_MAX_REQUESTS(默认为500)被replace时不断前后移动并被replace,所以在内核之间平衡它们将会非常棘手。 让Linux调度程序根据需要处理这个更好。