2011-09-01 35 views
4

为什么php memory_get_peak_usage的结果与Linux中使用'top'或'ps'命令时分配给进程的内存大小差异太大?memory_get_peak_usage和实际php进程内存使用之间的差异

我设置2 MB memory_limit的的在php.ini 我的单串PHP脚本与

echo memory_get_peak_usage(true); 

说,它正在使用786432个字节(768 KB)

如果我尝试问系统关于当前PHP程序

echo shell_exec('ps -p '.getmypid().' -Fl'); 

它给了我

F S UID  PID PPID C PRI NI ADDR SZ WCHAN RSS PSR STIME TTY   TIME CMD 
5 S www-data 14599 14593 0 80 0 - 51322 pipe_w 6976 2 18:53 ?  00:00:00 php-fpm: pool www          

RSS参数是6976,所以内存使用情况是6976 * 4096 = 28573696 =〜28 MB

从何而来的是28 MB和有任何方法来降低正在使用由PHP-FPM进程的内存大小?

回答

0

峰值内存使用量仅适用于当前脚本。

5

内存大小主要由PHP进程本身使用。 memory_get_peak_usage()返回特定脚本使用的内存。减少内存开销的方法是去除扩展的数量,静态编译PHP等等。但是不要忘记,php-fpm(应该)fork,并且PHP进程之间的许多内存使用情况并不不同事实共享(直到它改变)。

+0

谢谢。因此,如果我打开'/ proc/* pid */status'并查看VmExe:7508 kB VmLib:\t 18328 kB,这是否意味着VmLib实际上适用于所有php进程?换句话说,每个25 Mb的3个进程实际上并不占用25 + 25 + 25 = 75 Mb,而是18 + 7 + 7 + 7 = 39 Mb。 – Miroshko

+0

没有办法告诉。分叉后很多事情可能会被共享,但它可能不会^ _ ^。我的理解是,最初所有内容都使用相同的内存位置,但只要分叉改变了内存,就会发生写入时复制。我不知道你是否可以从ps中读出来告诉你真相。 – Evert

1

PHP本身可能只能设置为2meg的限制,但它在Apache子进程中运行,并且该进程将具有更高的内存占用量。

如果您是从命令行运行脚本,那么您将自己获得PHP的内存使用情况,因为它未包装在Apache中并且正在独立运行。

+0

谢谢。从示例中我看到,我将PHP作为CGI应用程序运行,因此不使用Apache – Miroshko

+0

实际上,您的示例提示它正在Apache下运行,因为用户名是www-data –

+0

这并不能证明任何事情。 php-fpm也在www数据下运行 – Miroshko