我有一台运行着许多 wordpress 博客的服务器,其中许多博客有几百/几千篇帖子。
每隔几天,由于 Wordpress 上运行一个名为 WP-cron.php 的文件,服务器速度就会变得非常缓慢。我的整个 Apache 进程日志变成了这样:
http://imgur.com/A7K9k.png
时间长了不少。服务器无法运行。
每个进程占用大约 1.1% 的内存。当我们同时运行 50 个进程时,情况就变得很疯狂。并非所有进程都来自同一个博客,它们分布很广泛。在 WHM 的 Apache 进程页面中,它们通常全部设置为“C”状态,这意味着正在关闭。但它们可以一直待在那里,直到服务器崩溃,并且仍然占用内存。
只要谷歌搜索“wp-cron.php load”,你就会发现很多遇到类似问题的人。
无论如何,我们认为这是由于用户在安装的 wordpress 中添加了大量无效的“ping 列表”。这反过来又导致 wordpress 无限循环这些列表。
问题 1。 有没有人对导致 Wordpress 文件 wp-cron.php 无限循环的原因有其他建议?我仍然认为这是 ping 造成的,因为我们联系过的所有帐户负载过高的人都有大量的 ping 列表。
问题 2。 即使这是由于 wordpress 中的 pinglist 过多造成的。我们无法细心照料服务器上的每个帐户,等待它开始生成 wp-cron 进程。这种情况经常发生在一夜之间,而我在凌晨 2 点开始收到有关负载的短信警报。
我安装了 CSF,如果进程运行时间超过 XXX 时间,它显然会终止进程。但我被告知它不会捕获进程,因为它们最终处于“关闭”状态(它们在 WHM 的 Apache 页面上显示为“C”)。显然,CSF 只会终止“正在运行”的进程,而 C 不计算在内。
我还见过其他各种脚本,例如:http://dltj.org/article/die-apache-die/。我查看了 /proc 的状态。但我对哪个分隔部分是运行时间感到困惑。如果有任何方法我可以将其重新连接到实际的 Apache 进程,以便我可以看到正在运行的文件(因此只关闭连接到 wp-cron.php 的连接,状态为“C”)。
总的来说,我知道问题 2 掩盖了真正的原因。但我确实把整个事情都放到了 Wordpress 的过多 ping 列表中。但我实在无法坐在那里 24/7 地照看每一个安装。所以我需要一种方法来在我不在的时候拯救服务器。
任何帮助将非常感激。
答案1
您是否可以让不同的服务器运行同一个网站,并在那里运行 cron?对于我们的一些大型网站,我们就是这样做的,我们在面向客户的 Web 页面上禁用了 wp-cron,但内部仍运行一个。
将 define('DISABLE_WP_CRON', true); 添加到 wp-config,
答案2
看看优秀的进程观察者/杀手,普斯蒙。它只是一个在后台守护自身进程的 Perl 脚本,并包含一个 Apache 样式的配置文件,如果进程消耗了 X 量的内存或消耗了 X 量的 CPU 时间,则可以终止进程。PSMon 可以在决定终止进程时通过系统日志或电子邮件向您发出警报。
另外,您可能希望将 wp-cron.php 包装在一个 shell 脚本中,该脚本将使用锁文件并确保在任何给定时间只有一个 wp-cron.php 副本在运行。
答案3
问题是,您的用户是否愿意不使用 wp-cron.php?您的博客/插件是否依赖于它们?如果不是,您可以使用 mod_security 或简单的 apache 配置来阻止博客 wp-cron.php 执行。对于每个博客,WP 将运行自己的 wp-config.php 实例。