【问题标题】:php cli script hangs with no messagesphp cli脚本挂起,没有消息
【发布时间】:2010-05-02 20:06:05
【问题描述】:

我编写了一个通过 SSH 和 nohup 运行的 PHP 脚本,旨在处理来自数据库的记录并对其进行处理(例如,处理一些图像,更新一些行)。

它适用于小负载,最多可能有 10k 条记录。我有一些较大的数据集,可以处理大约 40k 条记录(我意识到不是很多,但是当每条记录需要下载和处理多达 50 张图像时,这会增加很多工作量)。

处理较大的数据集可能需要数天时间。有时我会在我的调试日志中看到内存错误,这很清楚——但有时脚本只是看起来“死”了,或者在我身上变成了僵尸。我的调试日志的尾部刚刚停止,没有错误消息,nohup 日志的尾部没有错误,并且进程仍然显示在 ps 列表中,看起来像这样--
26075 分/0 S 745:01 /usr/bin/php ./import.php
但没有完成任何工作。

谁能给我一些关于为什么进程会退出的想法?据我所知,显而易见的事情(如 php 脚本超时和内存问题)并不是一个因素。

感谢任何提示

PS--这是托管在 Godaddy VDS 上(不是我的选择)。我有点怀疑 godaddy 有某种限制可能会影响我,尽管我在代码中添加了哪些覆盖(例如 set_time_limit(0);)。

【问题讨论】:

  • (1) 你不能把处理分成更小的块吗? (2) 为什么用 nohup 代替 screen?
  • 好吧,它一次运行 500 条记录。我敢肯定还有其他策略来分担负载,但这似乎是合理的,只是耗时。初始导入后,记录更新要小得多且易于管理。我已经阅读过有关屏幕的信息,但我没有使用它的经验——使用屏幕有什么好处?谢谢

标签: mysql linux php


【解决方案1】:

很可能是OOM killer。如果你真的,真的 真的想要远离它,作为root,让你的进程写-17/proc/self/oom_adj注意:内核通常知道得更好。规避 OOM 杀手实际上会削弱您尝试查询的相同 RDBMS。那将是多么恶性循环:)

您可能(相反)希望根据您从/proc/loadavg/proc/meminfo 读取的内容错开查询。如果您以指数方式增加负载或交换,则需要退出,尤其是作为后台进程:)

此外,在您跑步时监控IOWAIT。与系统启动时间相比,这可以从/proc/stat 取平均值。开始时和进度时请注意。

不幸的是,被称为 OOM 杀手的连环杀手不维护除解析内核消息之外可访问的正文计数。

或者,您的 cron 作业不断达到其ulimited 分配的堆数量。无论哪种方式,您的工作都需要在适当的时候后退,或者在做任何工作之前防止它自己的消亡(如上所述)。

附带说明,您可能不应该在共享主机上做您正在做的事情。如果它那么大,那么是时候(至少)获得一个 VPS,您可以在其中控制哪些进程可以做什么。

【讨论】:

  • 还有'strace'来查看它是否挂在系统调用或php内部的东西上
  • @Marc - 可能,但不太可能。 “PHP 内部”会导致磁盘休眠或传递一些错误。两者都很明显。
  • @Marc - 或者只是一个僵尸进程
  • 谢谢大家!蒂姆,作为一个简单的 PHP 黑客,我担心这有点超出我的能力——这是在虚拟服务器上运行的,只有 mysql 和这个脚本在运行。这绝对不是我的选择,我在两台 Amazon EC2 机器(一台作为服务器,一台作为 mysql 服务器)上开发它,没有任何问题!如果可能的话,您能否提供更多关于使用 IOWAIT 和 loadavg 来限制 PHP 脚本的方法的信息?谢谢
猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2016-09-21
相关资源
最近更新 更多