1

我试图了解一些 php 进程的内存使用情况。我试过同时使用get_memory_usage()pmap,但结果似乎相差了大约一个数量级。我已经尝试过memory_get_usage()memory_get_usage(true),以及memory_get_peak_usage(true),但即使使用memory_get_peak_usage(true)(所有三个品种中最大的一个),通过 pmap 报告的内容仍然很大。

更具体地说,memory_get_peak_usage(true)在我的 php 脚本中调用每一分钟会返回 1.75MB 到 3.5MB 之间的值,而典型的结果pmap -d PID如下:

...

b7839000       4 r---- 0000000000008000 0ca:00060 libcrypt-2.11.1.so
b783a000       4 rw--- 0000000000009000 0ca:00060 libcrypt-2.11.1.so
b783b000     156 rw--- 0000000000000000 000:00000   [ anon ]
b7864000       8 rw--- 0000000000000000 000:00000   [ anon ]
b7867000      12 r-x-- 0000000000000000 0ca:00060 libgpg-error.so.0.4.0
b786a000       4 r---- 0000000000002000 0ca:00060 libgpg-error.so.0.4.0
b786b000       4 rw--- 0000000000003000 0ca:00060 libgpg-error.so.0.4.0
b786c000       4 r---- 0000000000000000 000:00000   [ anon ]
b786d000      16 rw--- 0000000000000000 000:00000   [ anon ]
b7871000     108 r-x-- 0000000000000000 0ca:00060 ld-2.11.1.so
b788c000       4 r---- 000000000001a000 0ca:00060 ld-2.11.1.so
b788d000       4 rw--- 000000000001b000 0ca:00060 ld-2.11.1.so
bffc7000     136 rw--- 0000000000000000 000:00000   [ stack ]
f57fe000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 32740K    writeable/private: 13116K    shared: 28K

如果我理解正确,可写/私有数字是最相关的数字,因为它是进程专用的内存。近 13MB 与 .com 报告的数量相差甚远memory_get_peak_usage(true)。有人可以解释差异吗?

4

2 回答 2

3

我的理解是,这memory_get_peak_usage()将返回脚本使用的内存量。所以这还不包括 PHP 的开销。

返回分配给 PHP 脚本的内存峰值(以字节为单位)。

您可以通过编译更少的扩展来减少 PHP 使用的内存。

PHP 本身是一个大型应用程序,尤其是带有默认扩展的应用程序。我们(作为 php 开发人员)可以编写简单的代码,simplexml_load_string()然后观看魔术的发生,但支持这种魔术的代码正在内存中的某个地方运行。查看 的输出phpinfo()将显示安装了多少扩展。PHP 内部包含将您的 PHP 转换为操作码的代码,然后是执行这些操作码的代码。PHP 的每个实例在执行时都会产生开销。

这种内存使用显然不是微不足道的,但可以预期。如果您必须编写所有代码来处理传入的 GET/POST/FILES 管理 XML、文件和流魔术等。内存使用量会很快增加。

因此,一种常见的性能技术是删除所有不需要的扩展来缩小可执行文件的大小。对于内存受限的服务器(大多数已加载的服务器),删除一些扩展并将内存使用量从 9 兆降至 7 兆会导致更多 apache 工作人员运行。

这种开销不共享,因为每次执行实际上都是 PHP 执行的单独副本。使用线程安全构建可以使用替代方案,但并非所有 PHP 扩展都是线程安全的。

删除扩展 查看您正在使用的功能。mysqli_*? xml_*? 等等。还看看 PHP 是如何构建的,这是我的配置行:

Configure Command => './configure' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-mysql=mysqlnd' '--with-gd' '--enable-soap' '--with-libxml-dir=/usr/lib/' '--with-mysql-sock=/tmp' '--with-tidy' '--with-jpeg-dir=/usr/lib/' '--with-xsl' '--with-curl' '--with-zlib' '--enable-gd-native-ttf' '--with-openssl' '--with-mcrypt' '--with-pdo-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-bz2' '--enable-bcmath'

如果我要减少内存,我会从构建 PHP 开始./configure --disable-all(删除默认扩展),然后显式添加我新使用的扩展。我不再使用libxml我的代码,soap所以我也不能放弃这些位。我可以将我的tidy工作外包给齿轮工和命令行,所以我也会把它拉出来。然后运行我的代码(在这里进行单元测试会很棒)并查看发生了什么问题。使用所需的扩展重新构建 PHP,冲洗并重复。显然不要在生产中这样做,否则你将有一个Bad Time

于 2013-02-14T14:32:46.940 回答
0

字节与位是 10 的一个因素。因此 1.3 MBytes = 13MBits

于 2013-02-14T14:32:29.667 回答