PHP 运行太慢,总是显示“504 网关超时”
My server spec:
Dual core ATOM 330 CPU
2GB RAM
Use nginx with PHP in fastcgi
use eaccelerator
CPU 74.3%id
RAM used: 350MB of 2GB
我的服务器上有很多站点,cron 每分钟都在运行,甚至在某些时候,cron 会同时运行两倍或三倍。
我所有站点的 cron 都很重,通常 cron 运行时间超过一分钟。
我的 nginx.conf 变得太大,以至于 nginx 拒绝启动,因为其中的站点太多了。这个问题已经通过增加解决了server_names_hash_max_size
。我计划在我的服务器中添加更多站点
现在,打开我的网站总是显示504 Gateway Time-out
。我测试了许多加速器和 PHP 设置,但这种情况504 Gateway Time-out
仍然发生。
504 Gateway Time-out
当 cron 被禁用时,遗嘱就会消失
我不知道:这是因为处理器能力不够吗?
我该怎么办?升级我的处理器?
- - - - 添加
这是top
我现在的 CPU:
Cpu(s): 17.5%us, 3.8%sy, 0.1%ni, 71.6%id, 6.9%wa, 0.1%hi, 0.1%si, 0.0%st
答案1
该错误是 nginx 告诉您 PHP 超时。
要确定问题所在,我们需要查看 PHP 代码实际上在做什么。
如果错误与 cron 作业密切相关,并且我假设这些 cron 作业正在运行 PHP 脚本和/或竞争常规 PHP 代码使用的相同资源(可能是 DB 或其他东西) - 那么您应该从那时开始寻找争用。
某些原因导致您的 PHP 会话无法完成其代码并挂起 - 专注于此,您就会找到答案。(此外 - 为这种情况设置优雅的错误页面 - 我认为 nginx 允许您这样做!)
答案2
我该怎么办?升级我的处理器?
显然不是——从您的统计数据来看,您的处理器空闲状态约为 75%,所以这很可能不是问题所在。
你查看过 IO 使用情况吗?我敢肯定,你的进程必须等待 IO,因此,所花的时间比正常情况下要长得多。
运行top
并观察%wa
CPU 使用率行中的项目。以下是我的一台服务器的示例输出:
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
如果该%wa
值高于 20% 左右,那么很可能就是您的问题。