测量程序的 RAM 使用率

Ole*_*nge 50 process memory measure

time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。

我正在寻找类似的东西,可以测量程序和任何孩子的最大 RAM 使用量。最好应该区分已使用和未使用的已分配内存。也许它甚至可以给出中值内存使用量(因此在长时间运行时您应该期望内存使用量)。

所以我想做:

rammeassure my_program my_args
Run Code Online (Sandbox Code Playgroud)

并获得类似于以下内容的输出:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes
Run Code Online (Sandbox Code Playgroud)

我看过memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82但我认为这有点像黑客。

Ruf*_*ufo 35

time是你的 shell 的内置程序。如果您喜欢time但需要更多信息,请time在详细 ( -v) 模式下尝试 GNU :

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
Run Code Online (Sandbox Code Playgroud)

在包管理器中搜索包“time”或“gnutime”。

  • 例如,在一个精确分配 10 MB(并触及每个页面)的测试程序中 - GNU time 报告 maxRSS 为 42608 KiB - 而 `tstime` 报告为 10652 KiB。再次在 Ubuntu 10.04 下。 (5认同)
  • 请注意,GNU 时间报告的某些信息可能不准确。例如,在 Ubuntu 10.04 下:手册页指出“数字仅与 wait3(2) 返回的数字一样好”。例如,`wait3` 填充了`getrusage(2)` 中描述的结构:“在Linux 下并非所有字段都有意义。[..]'。 (3认同)

max*_*zig 28

您可以使用tstime来测量进程的高水位内存使用情况(RSS 和虚拟)。

例如:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb
Run Code Online (Sandbox Code Playgroud)

它还支持更容易解析的输出模式 ( -t)。

  • “进程的 RAM 使用率”不是一个明确定义的值:如果同一程序有多个实例在运行,它们共享可执行文件。大多数程序共享`glibc`(以及其他各种库,它们被称为“共享”)。许多守护进程将配置加载到内存和 fork(2) 子进程中,然后它们共享配置数据。然后在由内核管理的 readahead/writebehind 缓冲区中有数据。还有一些服务是一群松散耦合的进程(想想您的桌面环境及其所有小程序和后台内容)。 (3认同)

Sté*_*nez 17

也许矫枉过正,但我​​刚刚发现它valgrind有一个不错的工具,名为massif. 我对它进行了测试xterm

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less
Run Code Online (Sandbox Code Playgroud)

你会得到一个很好的内存使用图:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4
Run Code Online (Sandbox Code Playgroud)

以及过于详细的内存使用信息。valgrind 手册中的详细信息。

不过,程序运行速度会慢 20 倍左右。另外,我在xterm. 他们的内存占用已被考虑在内,因为--trace-children=yes选项就在那里!

  • 20 倍的速度损失使其不适合我的情况。否则非常漂亮的图表! (2认同)

Vla*_*lov 6

尽管这个话题已经很老了,但我想分享另一个从 cgroups Linux 内核功能中出现的项目。

https://github.com/gsauthof/cgmemtime

cgmemtime 测量进程及其后代进程的高水位 RSS+CACHE 内存使用情况。

为了能够这样做,它将进程放入自己的 cgroup 中。

例如,进程 A 分配 10 MiB 并分叉分配 20 MiB 的子进程 B,并分叉分配 30 MiB 的子进程 C。所有三个进程共享一个时间窗口,它们的分配导致相应的 RSS(常驻集大小)内存使用。

现在的问题是:运行A的结果是实际使用了多少内存?

答案:60 MiB

cgmemtime 是回答此类问题的工具。