【问题标题】:Difference between memory_get_peak_usage and actual php process' memory usagememory_get_peak_usage 与实际 php 进程的内存使用量之间的差异
【发布时间】:2011-09-01 16:40:25
【问题描述】:

为什么 php memory_get_peak_usage 的结果与在 Linux 中使用 'top' 或 'ps' 命令时显示为分配给进程的内存大小有很大差异?

我在 php.ini 中设置了 2 Mb 的 memory_limit 我的单字符串 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 进程使用的内存大小?

【问题讨论】:

    标签: memory-management php


    【解决方案1】:

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

    【讨论】:

    • 谢谢。因此,如果我打开 '/proc/*pid*/status' 并看到 VmExe: 7508 kB VmLib: 18328 kB,这是否意味着事实上 VmLib 对于所有 php 进程都是通用的?换句话说,每个 25 Mb 的 3 个进程实际上占用的不是 25 + 25 + 25 = 75 Mb,而是 18 + 7 + 7 + 7 = 39 Mb?
    • 没办法说。分叉后可能会共享许多东西,但可能不会^_^。我的理解是,最初一切都使用相同的内存位置,但是一旦 fork 更改内存,就会发生写时复制。我不知道你是否可以从 ps 中读出这一点来告诉你真相。
    【解决方案2】:

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

    如果您从命令行运行脚本,您将获得 PHP 本身的内存使用情况,因为它没有封装在 Apache 中并且是独立运行的。

    【讨论】:

    • 谢谢。从示例中可以看出,我将 PHP 作为 CGI 应用程序运行,因此没有使用 Apache
    • 实际上,您的示例暗示它正在 Apache 下运行,因为用户名是 www-data
    • 这并不能证明什么。 php-fpm 也在 www-data 下运行
    【解决方案3】:

    内存使用峰值仅针对当前脚本。

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多