php - 当 CPU 在低优先级进程中为 100% 时 PHP-FPM 没有响应
问题描述
当 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 Gateway Timeout”(浏览器、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,PHP 7.2。
解决方案
找到了解决方案!
该问题与 100% CPU 使用率或仅一个 CPU 无关。由于我有一个循环来打开每个音频转换器(bash 文件),并等待它完成运行下一个,因此 PHP会话被锁定!因此,当同一会话中的另一个 PHP 脚本尝试执行时,它无法读取会话文件,因此,PHP 冻结(等待访问会话文件,直到出现“网关超时”错误)。这就是为什么只有 PHP 冻结,而不是其他软件。
为了解决这个问题,我必须在主循环之前运行它:
session_write_close();
session_start(['read_and_close'=>true]);
因此,它写入并关闭会话文件,然后再次读取它一次,而不锁定它。
这仅适用于 PHP 7+,显然,您不能编写任何会话数据。或者,在循环之后,只需使用 再次打开会话session_start()
。
推荐阅读
- reboot - 如何通过 c# 语句重新启动 Windows Server 2016?
- dependency-injection - 应用程序洞察不适用于 Azure Functions 中的启动 DI
- c# - C# WriteLine 方法在括号内显示数字,而不是我想要替换的数字
- assimp - Assimp - 如何访问与网格分开的电枢?
- swift - 如何修复 pod lib lint 在 iOS 13 上无法识别 UIColor.label
- django - 访问查询集中列表中的元素
- github - 使用 github graphql 获取分支首次提交
- nativescript - 更改大动作栏标题字体
- prolog - 检查一个集合是否是另一个集合的子部分的谓词正确检查但只生成无效集合
- c++ - 如何递归地向父窗口添加/删除子窗口