如何在Linux中监控PHP的内存使用情况?

21

我过去使用过Valgrind的massif工具来监控内存使用情况。

请问有谁知道如何捕获在Linux Lighttpd服务器上生成的php进程的内存使用情况?

我发现Valgrind无法附加到已经运行的进程(而且我也不会事先知道php进程的PID)。

我只能看到lighttpd的内存使用情况,而看不到通过lighttpd cgi模块生成的PHP进程。

谢谢!

4个回答

16

2
这是仅脚本的内存使用情况,还是包括了 PHP 进程的内存使用情况?此外,如果有多个脚本正在运行,要在任意时刻获取峰值使用率将会很困难。 - DEzra
3
在 memory_get_peak_usage(true) 的第一个参数中添加布尔值 true 将返回 PHP 进程的内存使用情况。 - scotts

9

你不能使用“ps”工具吗?

$ ps -F -C php-cgi

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
http     10794 10786  0  4073   228   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
http     10795 10794  0  4073    28   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
http     10796 10786  0  4073   228   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
http     10797 10796  0  4613  3544   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
...

RSS是进程在实际内存中占用的大小,单位为千字节。

总结一下,在bash中(有点生疏,抱歉)

#!/bin/bash

total=0
for i in `ps -C php-cgi -o rss=`
do
    total=$(($total + $i))
done
echo "Memory usage: $total kb"

# Output: Memory usage: 4540 kb

一句话简述:

total=0; for i in `ps -C php-cgi -o rss=`; do total=$(($total+$i)); done; echo "Memory usage: $total kb";

我知道ps中的内存部分可靠性受到质疑,但至少它可以让你了解使用情况。


如果你正在使用php-cgi,那么这很好,但如果你正在使用mod_php,那么你就没那么幸运了,可能需要选择第一个答案。 - John Hunt

4
除了上面显示的内置命令之外,您可以使用XHProf来对脚本进行分析,并使用XHGui在漂亮的浏览器应用程序中显示分析结果。您将获得有关您的方法如何使用内存以及应用程序内存使用峰值的详细信息。

谢谢,我总是喜欢听到关于新的性能分析工具的消息。我一定会去查看 XHProf 和 XHGUI。 - DEzra

2

http://php.net/manual/zh/function.memory-get-usage.php

该函数可以在脚本内部获取线程所使用的内存量。由于脚本(和线程)存在的时间最多只有几毫秒 - 只需要生成页面的时间 - 因此在 PHP 之外捕获它可能会很困难。

  • 备选方案

您还可以从服务器获取更精确的调试信息 - 我个人使用 xdebug,当它抛出错误/警告时,会给您提供堆栈跟踪、时间和内存使用情况。您可以通过以下方式在脚本末尾触发:

trigger_error ('Finished', E_USER_NOTICE);

它会为您提供信息。我不确定是否能够捕获数据 - 如果需要,文档中可能有一个函数说明如何操作 - 我模糊地记得见过这样的内容。


2
嗨,是的,我尝试了memory_get_usage和memory_get_peak_usage这两个函数在一个脚本上,该脚本创建了一个字符串并循环50次,每次增加字符串长度。似乎memory_get_usage()总是返回2mb(字节)。这对我来说似乎是错误的(除非php预先为所有脚本分配了2mb的空间?? - DEzra
1
我稍微更新了我的回答 - xdebug 可以从 http://www.xdebug.org/ 获取/查看。 - Meep3D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接