【发布时间】:2017-10-02 15:01:04
【问题描述】:
我有一个 PHP 脚本,它通过 curl 运行许多 http 请求 - 我使用了 Rolling Curl (curl_multi) 的变体,以便可以同时运行请求。该脚本每隔几分钟使用 cron 运行一次。
它在 VPS 上,我从 lfd(ConfigServer 安全和防火墙)收到了一些“资源使用过多”警告,因为脚本的资源使用超过了 512MB 的阈值。
一个示例通知是:
资源:虚拟内存大小
超过:582 > 512 (MB)
可执行文件:/path/to/php-cgi
命令行:/path/to/myscript.php
所以我将阈值提高到 800MB,并在每次脚本运行时使用memory_get_peak_usage(true) 记录脚本的内存使用情况。
但是,memory_get_peak_usage(true) 的结果始终为 2MB...这与警告中显示的虚拟内存使用量相去甚远。
注意 - 脚本只运行一个实例,因为使用flock 会阻止多个实例。
那么我错过了什么?
更新 - 虚拟内存使用量也大于 php.ini memory_limit
将阈值提高到 800MB 后,我仍然偶尔会收到来自 lfd 的通知。我还检查了 php.ini 设置,并且 memory_limit 设置为 256MB - 从理论上讲,如果它使用的超过这个,脚本就不会运行。由此我猜测:
a) 使用内存的不是 PHP(可能是 MySQL 或 CURL - 这些使用的内存是否包含在 frommemory_get_peak_usage(true) 的值中?)
b) 我没有从 lfd 得到准确的数字
第二次更新 - MySQL 使用的内存不包含在 memory_get_peak_usage(true)
我怀疑这是问题所在 - 但我不确定 CSF 究竟包含在资源图中的内容。我将研究如何提高 MySQL 请求的效率,看看这会如何影响事情。
【问题讨论】:
-
memory_get_peak_usage(true)只检索当前正在运行的脚本的使用情况,你的脚本需要多长时间才能运行,是否有可能在给定时间运行多个进程实例? -
脚本运行时间在 0.1 到 20 秒之间,但应该只有一个脚本实例在运行,因为我正在使用羊群防止多个实例
-
我遇到了同样的问题。该脚本运行时间不到 0.02 秒,但根据 CSF/LFD,它的内存使用量(“虚拟内存大小”)似乎超过 312MB。从命令行调用 PHP(在我的例子中也是通过 cron)调用 PHP 时是否没有释放资源?
-
@zmippie - 自几年前发布以来,我了解到 CSF/LFD 报告的内存使用情况是虚拟内存而不是真实内存。此外,CSF/LFD 显示的内存使用情况并不准确,可用内存比读数显示的要多得多。在过去的几年里,我们已经大大扩展了这些流程,并且会收到内存使用警告,远远超出服务器的处理能力。但是,服务器上的负载始终保持在较低水平。最后我们关闭了通知,因为它们没有用。
-
@Ryan 感谢您提供的信息,非常感谢!所以CSF/LFD的报告有点模糊。现在已经有几天没有看到 CSF/LFD 通知了,所以它可能与脚本中抛出的错误有关(其中有一个错误,在我的消息发布后不久就修复了)。知道脚本错误是否与它有关会很有趣。也许在将来,当我有空的时候;-)