nginx + fastcgi

nginx + fastcgi

如何让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 调度程序根据需要处理这个问题。

相关内容