在低优先级进程中,CPU为100%时,PHP-FPM不响应

时间:2019-01-17 22:58:04

标签: php php-7.2 fedora-29

CPU使用率达到100%时我遇到问题:PHP-FPM无法响应,即使使用100%CPU的进程也以最低优先级(+19)运行。

让我解释一下:我的网站使用inotify + bash脚本触发了一个音频转换器(ffmpeg)。转换器正在使用“ nice -n 19”运行。因此,CPU使用率为100%,但从理论上讲,PHP-FPM具有优先级(默认为0优先级)。

会发生什么:仅PHP冻结。 Apache可以响应JPG / CSS / JS之类的文件。 Linux稳定,其他软件也是如此。所有.php返回“ 504网关超时”(浏览器,Apache响应)。 Apache打开了许多php-fpm实例并使其保持打开状态。

30585 fedora    19   0.0   0.3   0:00.00 snippeter
30586 fedora    19  25.0   2.8   0:00.10 ffmpeg

15640 fedora     0   0.0   1.0   0:00.12 php-fpm
17174 fedora     0   0.0   1.0   0:00.10 php-fpm
20583 fedora     0   0.0   0.9   0:00.00 php-fpm
21072 fedora     0   0.0   0.9   0:00.00 php-fpm
21309 fedora     0   0.0   0.9   0:00.00 php-fpm
22601 fedora     0   0.0   0.9   0:00.00 php-fpm
23172 fedora     0   0.0   0.9   0:00.00 php-fpm
23277 fedora     0   0.0   0.9   0:00.00 php-fpm
24170 fedora     0   0.0   0.9   0:00.00 php-fpm
24823 fedora     0   0.0   0.9   0:00.00 php-fpm
24916 fedora     0   0.0   0.9   0:00.00 php-fpm
26589 fedora     0   0.0   0.9   0:00.00 php-fpm

%Cpu(s):  8.5 us,  4.5 sy, 85.6 ni,  0.0 id,  0.5 wa,  1.0 hi,  0.0 si,  0.0 st

更改php-fpm优先级(默认),没有区别。

我不知道该怎么办...我想在后台运行进程,即使使用100%的CPU,但仍可以使PHP + Apache正常运行。

服务器:Fedora 29,PHP 7.2。

1 个答案:

答案 0 :(得分:1)

找到了解决方案!

问题与100%CPU使用率或一个CPU无关。由于我有一个循环来打开每个音频转换器(bash文件),并等待其完成以运行下一个音频转换器,因此PHP 会话已被锁定!因此,当另一个PHP脚本在同一会话中尝试执行时,它无法读取该会话文件,因此PHP冻结(等待对会话文件的访问,直到出现“网关超时”错误)。这就是为什么只有PHP冻结,而不冻结其他软件的原因。

要修复,我必须在主循环之前运行它:

session_write_close();
session_start(['read_and_close'=>true]);

因此,它会写入并关闭会话文件,然后再次读取它一次,而不会锁定它。

这仅在PHP 7+中有效,并且显然,您不能编写任何会话数据。或者,在循环之后,只需使用session_start()重新打开会话即可。