PHP-在低优先级进程中 CPU 为 100% 时 FPM 没有响应
PHP-FPM not responding when CPU is 100% in low priority processes
当 CPU 100% 使用时我遇到了问题:PHP-FPM 没有响应,即使使用 100% CPU 的进程是 运行 优先级最低 (+19)。
让我解释一下:我的站点使用 inotify + bash 脚本触发音频转换器 (ffmpeg)。转换器 运行ning 使用 "nice -n 19"。因此,CPU 使用率为 100%,但理论上,PHP-FPM 具有优先级(默认 0 优先级)。
发生了什么:只有 PHP 冻结了。 Apache 可以响应 JPG/CSS/JS 这样的文件。 Linux稳定,其他软件也是。所有 .php returns“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 优先级 (renice),没有区别。
我不知道该怎么做...我想 运行 在后台处理,即使使用 100% CPU,但保持 PHP+Apache 运行正常。
服务器:Fedora 29,PHP7.2.
找到解决方案!
该问题与 100% CPU 使用率无关,或仅与一个 CPU 使用率有关。因为我有一个循环来打开每个音频转换器(bash 文件),并等待它完成到 运行 下一个,PHP session 被锁住了!因此,当另一个 PHP 脚本在同一会话中尝试执行时,它无法读取会话文件,因此 PHP 冻结(等待访问会话文件,直到 "Gateway Timeout"错误)。这就是为什么只有 PHP 冻结,而不是其他软件。
要修复,我必须 运行 在主循环之前这样做:
session_write_close();
session_start(['read_and_close'=>true]);
因此,它写入并关闭会话文件,并在不锁定的情况下再次读取它。
这只适用于 PHP 7+,显然,您不能写入任何会话数据。或者,在循环之后,只需使用 session_start()
.
再次打开会话
当 CPU 100% 使用时我遇到了问题:PHP-FPM 没有响应,即使使用 100% CPU 的进程是 运行 优先级最低 (+19)。
让我解释一下:我的站点使用 inotify + bash 脚本触发音频转换器 (ffmpeg)。转换器 运行ning 使用 "nice -n 19"。因此,CPU 使用率为 100%,但理论上,PHP-FPM 具有优先级(默认 0 优先级)。
发生了什么:只有 PHP 冻结了。 Apache 可以响应 JPG/CSS/JS 这样的文件。 Linux稳定,其他软件也是。所有 .php returns“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 优先级 (renice),没有区别。
我不知道该怎么做...我想 运行 在后台处理,即使使用 100% CPU,但保持 PHP+Apache 运行正常。
服务器:Fedora 29,PHP7.2.
找到解决方案!
该问题与 100% CPU 使用率无关,或仅与一个 CPU 使用率有关。因为我有一个循环来打开每个音频转换器(bash 文件),并等待它完成到 运行 下一个,PHP session 被锁住了!因此,当另一个 PHP 脚本在同一会话中尝试执行时,它无法读取会话文件,因此 PHP 冻结(等待访问会话文件,直到 "Gateway Timeout"错误)。这就是为什么只有 PHP 冻结,而不是其他软件。
要修复,我必须 运行 在主循环之前这样做:
session_write_close();
session_start(['read_and_close'=>true]);
因此,它写入并关闭会话文件,并在不锁定的情况下再次读取它。
这只适用于 PHP 7+,显然,您不能写入任何会话数据。或者,在循环之后,只需使用 session_start()
.