【问题标题】:memory_get_peak_usage(true) PHP and Virtual Memory Size resource usage are very differentmemory_get_peak_usage(true) PHP 和 Virtual Memory Size 资源使用情况有很大不同
【发布时间】: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 通知了,所以它可能与脚本中抛出的错误有关(其中有一个错误,在我的消息发布后不久就修复了)。知道脚本错误是否与它有关会很有趣。也许在将来,当我有空的时候;-)

标签: php curl memory cron


【解决方案1】:

PHP 的memory_get_usage 系列函数跟踪 PHP 的内部内存管理器的状态,该管理器负责所有直接被 PHP 变量等使用的内存。这也是memory_limit 设置的限制 - 达到限制后,内部内存管理器将拒绝从操作系统申请更多 RAM。

但是,并非您的进程使用的所有 RAM 都是通过该内存管理器分配的。例如,CURL 或 MySQL 连接库等第三方库的内存分配完全独立于 PHP,因为它们实际上是由 PHP 引擎执行的独立程序。另一个例子是,打开一个文件可能会导致它被操作系统内核映射到内存中,即使您从未将其内容读入 PHP 变量。

talk by Julien Pauli at PHP UK a few years ago 详细介绍了不同类型的内存使用情况以及如何衡量它们。

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多