如何让nginx在所有核心上均匀的代理php到fastcgi。
当我尝试对配置进行压力测试时,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;
}
答案1
将 nginx 工作进程设置为 20 是不必要的。有了四个 CPU 核心,就没有必要将其设置为高于 4。即使你有更多的 CPU 核心,你可能不会受益将其设置得更高。
除了将 nginx 进程设置得太高之外,您可能还将 fastcgi 进程设置得太高。160 已经很多了。除非您的 PHP 代码花费大量时间等待缓慢的资源,否则我怀疑您真的想一次处理 160 个 FastCGI 请求。由于您只有 4 个核心,这将使每个请求需要更长的时间才能完成。
我不确定你为什么认为你的 CPU 没有得到有效利用。查看你的顶部输出,最繁忙的两个核心仍然有 20% 和 30% 的时间处于空闲状态。这可能意味着 PHP 只需一次将请求传递给两个 FastCGI 进程即可跟上负载,也可能意味着它处理了多达 160 个并发请求,但它们不需要太多的 CPU 时间(例如它们正在等待网络或磁盘)。无论哪种方式,如果工作更均匀地分布在所有四个核心上,它就不会更快完成。
虽然我不推荐这样做,但您可以使用 强制进程在特定核心上运行taskset
。基本语法是tasket -c $CPU_LIST -p $PID
。例如,为了确保进程 17325 仅在第一个 CPU 核心上运行,您可以运行cpuset -c 0 -p 17325
。这种功能未集成到 spawn-fcgi 中,并且由于 PHP 进程在达到 PHP_FCGI_MAX_REQUESTS(默认为 500)并被替换时会不断来来去去,因此自己在核心之间平衡它们会很棘手。最好让 linux 调度程序根据需要处理这个问题。