memory_get_peak_usage(true)PHP和虚拟内存大小资源使用情况非常不同

时间:2017-10-02 15:01:05

标签: php curl memory cron

我有一个PHP脚本,通过curl运行许多http请求 - 我在Rolling Curl(curl_multi)上使用了一个变体,以便可以同时运行请求。该脚本每隔几分钟就用cron运行一次。

这是在VPS上,我收到了一些过多的资源使用情况'来自lfd(ConfigServer Security& Firewall)的警告,因为脚本的资源使用超过了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--这些内容包含在memory_get_peak_usage(true)的值中吗?)

b)我没有从lfd获得准确的数字

第二次更新 - MySQL使用的内存未包含在memory_get_peak_usage中(true)

我怀疑这是问题所在 - 但我不确定CSF在资源数据中究竟包含了什么。我将研究如何提高MySQL请求的效率,并了解它是如何影响的。

1 个答案:

答案 0 :(得分:1)

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

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

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