linux/unix进程的峰值内存使用情况

jes*_*199 356 linux command-line memory-management

是否有一个工具可以运行命令行并报告总共使用了多少RAM?

我在想象类似于/ usr/bin/time的东西

Jac*_*son 378

[ 编辑:适用于Ubuntu 14.04:/usr/bin/time -v command 确保使用完整路径.]

看起来/usr/bin/time确实给你这个信息,如果你通过-v(这是在Ubuntu 8.10).参见,例如,Maximum resident set size下面:

$ /usr/bin/time -v ls /
....
        Command being timed: "ls /"
        User time (seconds): 0.00
        System time (seconds): 0.01
        Percent of CPU this job got: 250%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.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): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 315
        Voluntary context switches: 2
        Involuntary context switches: 0
        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

  • "bash:-v:command not found"意味着bash截获时间来使用它自己.`/ bin/time -v`解决了它. (77认同)
  • @skalee在MacOS上尝试`time -l`,给出类似的输出. (21认同)
  • 从手册页:按时间显示的大多数信息都来自wait3(2)系统调用.这些数字与wait3(2)返回的数字一样好.在没有返回状态信息的wait3(2)调用的系统上,使用times(2)系统调用.但是,它提供的信息比wait3(2)少得多,因此在这些系统上,时间会将大部分资源报告为零. (15认同)
  • 可能它总是返回0因为ls没有做太多.尝试使用CPU密集型命令. (4认同)
  • 值得快速检查以确保输出有意义.Gnu时间有一个错误,它将报告实际内存使用量的4倍:http://stackoverflow.com/questions/10035232/maximum-resident-set-size-does-not-make-sense (3认同)
  • / usr/bin/time(又名GNU时间)1.7有一个错误,并没有报告准确的峰值内存使用信息:http://stackoverflow.com/a/10132854/62694 (3认同)
  • 此方法不准确。每次我在Linux 3.19上运行完全确定性的程序时,都会得到不同的结果。“最大居民集大小”字段显然受到系统上运行的其他事物的影响。 (3认同)
  • 在不同的发行版(CentOS 5.6,RHEL衍生版)中,Maximum RSS项始终为非零并且看起来合理(即对于更大的任务更大). (2认同)

net*_*etj 94

(这是一个已经回答的老问题..但仅仅是为了记录:)

我受到杨的剧本的启发,并提出了这个名为memusg的小工具.我只是将采样率提高到0.1来处理很短的生活过程.我没有监控单个进程,而是测量进程组的rss总和.(是的,我写了很多单独的程序一起工作)它目前适用于Mac OS X和Linux.用法必须类似于time:

memusg ls -alR / >/dev/null

它只显示当前的峰值,但我对记录其他(粗略)统计数据的轻微扩展感兴趣.

在我们开始任何严肃的分析之前,有这么简单的工具来看看它是很好的.

  • memusg脚本输出的单位是多少?字节?千字节? (6认同)
  • @gcb那么,这就是你在测量样品时得到的东西. (3认同)
  • @DanielStandage:可能以千字节为单位。它只是监视“ps -o rss=”显示的值,其中 rss 是我的 BSD 手册页中的“进程的实际内存(驻留集)大小(以 1024 字节为单位)”。 (2认同)
  • 答案中给出的memusg链接似乎已被打破.无论如何,/ usr/bin/time做得很好. (2认同)

jbe*_*rd4 62

Valgrind单线:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

注意使用--pages-as-heap来测量进程中的所有内存.更多信息:http://valgrind.org/docs/manual/ms-manual.html

  • "时间",我要离开你了. (13认同)
  • 这确实太大了.这个答案应该提到减速.我想要测量的命令通常需要35秒才能完成.我已经运行了这个valgrind命令来测量它超过半小时前,它仍然没有完成... (8认同)
  • 尽管如此,Massif的开销比"时间"要高得多,至少比"ls"这样的命令多花了10倍. (6认同)
  • +1为'valgrind --massif`.您还可以使用随附的`ms_print`工具进行便捷输出(包括随时间推移的ascii使用图表) (3认同)

Jon*_*son 32

也许(gnu)时间(1)已经做了你想要的.例如:

$ /usr/bin/time -f "%P %M" command
43% 821248
Run Code Online (Sandbox Code Playgroud)

但是其他分析工具可能会根据您的需求提供更准确的结果.

  • 这至少适用于CentOS(因此,我打赌,也是RHEL)系统.%P给出不相关的统计信息(%CPU),这取决于调度程序,因此是非常可变的. (2认同)
  • @Deleteman:`time`是使用`csh`时的内置命令.如果使用确切的路径,它将允许您运行外部命令.据我所知,只有GNU版本支持格式选项. (2认同)

rus*_*tyx 22

在Linux上:

使用/usr/bin/time -v <program> <args>并查找" 最大驻留集大小 ".

(不要与Bash time内置命令混淆!所以使用完整路径,/usr/bin/time)

例如:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .
Run Code Online (Sandbox Code Playgroud)

在BSD上,MacOS:

使用/usr/bin/time -l <program> <args>,寻找" 最大居民集大小 ":

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .
Run Code Online (Sandbox Code Playgroud)

  • `sudo apt-get 安装时间` (4认同)
  • [两年前添加的答案](/sf/answers/54222101/)是否已经覆盖了这一领域? (2认同)

sim*_*mon 18

实际上/ usr/bin/time可能会做你想要的.就像是.

 /usr/bin/time --format='(%Xtext+%Ddata %Mmax)'

详情请见时间(1)


ero*_*rtc 17

这是一种单行代码,不需要任何外部脚本或实用程序,也不需要您通过Valgrind或time之类的另一个程序来启动该过程,因此您可以将其用于已运行的任何过程:

grep VmPeak /proc/$PID/status
Run Code Online (Sandbox Code Playgroud)

(用$PID您感兴趣的过程的PID 代替)

  • 如果我不知道 PID 怎么办?例如,当程序运行时间很短(&lt;1s)时 (11认同)
  • “VmHWM:峰值驻留集大小”可能更适用于测量 RAM 使用情况(而不是包含许多其他内容的 VmPeak)。 (9认同)
  • @jfs 这真的取决于你想知道什么。IIRC VmPeak 是包括虚拟内存在内的最大总内存使用量,而 VmHWM 是峰值 RAM 使用量。所以如果你想知道你的程序要求的内存总量,使用 VmPeak;如果您想知道它在给定时间使用了多少实际 RAM,请使用 VmHWM。 (2认同)

Yan*_*ang 16

如果进程运行至少几秒钟,那么您可以使用以下bash脚本,它将运行给定的命令行,然后打印到stderr峰值RSS(替换rss您感兴趣的任何其他属性).它有点轻量级,它适用于我使用psUbuntu 9.04(我不能说time).

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的主要缺点是,如果进程在短时间内(例如接近尾声)分配了大量内存,则可能无法检测到。减少睡眠时间可能会有所帮助。 (2认同)

gsa*_*ras 16

在MacOS Sierra上使用:

/usr/bin/time -l commandToMeasure
Run Code Online (Sandbox Code Playgroud)

您可以使用grep您想要的东西.

  • 这个!我花了一个小时试图让Instruments.app和dtrace给我一个打开系统完整性的内存配置文件(无法将其关闭),而我所需要的只是这个简单的命令.一个小注释,你可以使用`command time -l`而不是`/ usr/bin/time -l`这将导致你的shell实际上调用一个名为`time`的二进制文件而不是内置函数.(是的,`command`不是占位符,`command time`不同于'time`.) (4认同)

ale*_*exn 8

好吧,如果你真的想要显示内存峰值和一些更深入的统计数据,我建议使用诸如valgrind之类的分析器.一个漂亮的valgrind前端是alleyoop.


Jas*_*son 7

time -f '%M' <run_program>
Run Code Online (Sandbox Code Playgroud)

  • 输出以千字节为单位(可能是千字节?)。请注意,在 bash 中,您需要指定完整路径,例如“/usr/bin/time”,以免使用不支持“-f”的内置“time”关键字。 (2认同)

Vic*_*nko 7

因为/usr/bin/time在许多现代发行版中不存在(代替 Bash 内置时间),您可以使用带有-v参数的Busybox 时间实现:

busybox time -v uname -r
Run Code Online (Sandbox Code Playgroud)

它的输出类似于 GNU 时间输出。Busybox 预装在大多数 Linux 发行版(Debian、Ubuntu 等)中。如果您使用 Arch Linux,您可以使用以下命令安装它:

sudo pacman -S busybox
Run Code Online (Sandbox Code Playgroud)


Dan*_*ane 5

您可以使用Valgrind之类的工具来执行此操作。


sta*_*tti 5

(根据其他答案)这是一个非常简单的脚本,用于监视已经运行的进程。您只需使用要监视的进程的pid作为参数来运行它:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1
Run Code Online (Sandbox Code Playgroud)

用法示例:

max_mem_usage.sh 23423
Run Code Online (Sandbox Code Playgroud)