【问题标题】:Peak memory usage of a linux/unix process [closed]linux / unix进程的峰值内存使用量[关闭]
【发布时间】:2010-10-20 22:44:03
【问题描述】:

是否有工具可以运行命令行并报告 RAM 使用总量峰值?

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

【问题讨论】:

    标签: linux command-line memory-management


    【解决方案1】:

    好吧,如果你真的想显示内存峰值和一些更深入的统计数据,我建议使用像 valgrind 这样的分析器。一个不错的 valgrind 前端是 alleyoop

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        看起来/usr/bin/time 确实为您提供了该信息,如果您通过-v(这是在 Ubuntu 8.10 上)。参见下面的Maximum resident set size

        $ /usr/bin/时间 -v ls / …… 正在计时的命令:“ls /” 用户时间(秒):0.00 系统时间(秒):0.01 此作业获得的 CPU 百分比:250% 经过(挂钟)时间(h:mm:ss 或 m:ss):0:00.00 平均共享文本大小(千字节):0 平均非共享数据大小(千字节):0 平均堆栈大小(千字节):0 平均总大小(千字节):0 最大驻留集大小(kbytes):0 平均驻留集大小(kbytes):0 主要(需要 I/O)页面错误:0 次要(回收帧)页面错误:315 自愿上下文切换:2 非自愿上下文切换:0 掉期:0 文件系统输入:0 文件系统输出:0 发送的套接字消息:0 收到的套接字消息:0 传递的信号:0 页面大小(字节):4096 退出状态:0

        【讨论】:

        • 可能它总是返回 0,因为 ls 没有做太多。尝试更占用 CPU 的命令。
        • 来自手册页:时间显示的大多数信息都来自 wait3(2) 系统调用。这些数字仅与 wait3(2) 返回的数字一样好。在没有返回状态信息的 wait3(2) 调用的系统上,将使用 times(2) 系统调用。但是,它提供的信息比 wait3(2) 少得多,因此在这些系统上,时间将大部分资源报告为零。
        • "bash: -v: command not found" 意味着 bash 会拦截使用它自己的时间。 /bin/time -v 解决了。
        • 值得快速检查以确保输出有意义。 Gnu time 有一个错误,它会报告实际内存使用量的 4 倍:stackoverflow.com/questions/10035232/…
        • @skalee 在 MacOS 上尝试 time -l,得到类似的输出。
        【解决方案4】:

        /usr/bin/time 实际上可能会做你想做的事。类似的东西。

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

        详见时间(1)...

        【讨论】:

        • 我似乎总是得到零,即使对于大型命令也是如此
        • jes5199,Liran,看着上面的 cmets,似乎 time(1) 可能会因为某些 linux 上的内存报告而中断......
        • 在 Ubuntu 16.04 上,文本和数据为零,但最大值为非零并产生有意义的值。我很满意。
        • 我希望那里的 Mmax 意味着我们想要它的意思....手册页对此有点简洁
        【解决方案5】:

        也许 (gnu) time(1) 已经做了你想做的事。例如:

        $ /usr/bin/time -f "%P %M" command
        43% 821248
        

        但其他分析工具可能会根据您要查找的内容提供更准确的结果。

        【讨论】:

        • 我似乎总是用这个得到零,即使是大型命令
        • 我在同一个程序上得到了可变的结果,比如 400% 0 和 0% 0。也许应该运行更长的时间才能准确?
        • 我不知道该建议什么。上面的代码正是我运行一个碰巧在历史上的乳胶命令的结果。正如我所说,使用其他工具可以获得更准确的结果。
        • 这至少适用于 CentOS(因此,我敢打赌,也适用于 RHEL)系统。 %P 给出不相关的统计信息 (%CPU),它取决于调度程序,因此变化很大。
        • @Deleteman:time 是使用 csh 时的内置命令。如果您使用确切的路径,它将允许您运行外部命令。据我所知,只有 GNU 版本支持 format 选项。
        【解决方案6】:

        如果进程运行了至少几秒钟,那么您可以使用以下 bash 脚本,该脚本将运行给定的命令行,然后将峰值 RSS 打印到标准错误(替代 rss 任何其他您感兴趣的属性在)。它有点轻巧,它适用于 Ubuntu 9.04 中包含的 ps(我不能说 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
        

        【讨论】:

        • 此方法的主要缺点是,如果进程在短时间内(例如接近尾声)分配大量内存,则可能无法检测到。减少睡眠时间可能会有所帮助。
        • 监控峰值内存使用的唯一方法是检查 /proc//status 和行 VmWHM(水高标记,意味着峰值驻留内存使用)如果您只需要监控一个进程.如果您需要监控一组进程使用的总 RAM,则必须使用 memory cgroup 并以这种方式读取状态。请注意,如果您的系统不支持 cgroupv2,则只有 root 可以创建内存 cgroup。任何基于采样/轮询的 hack 都会错过峰值。
        【解决方案7】:

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

        我受到杨的剧本的启发,想出了这个小工具,命名为memusg。我只是将采样率提高到 0.1 来处理很短的生命过程。我没有监控单个进程,而是让它测量进程组的 rss 总和。 (是的,我编写了许多可以协同工作的单独程序)它目前可以在 Mac OS X 和 Linux 上运行。用法必须与time类似:

        memusg ls -alR ///dev/null

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

        在我们开始任何认真的分析之前,有这样一个简单的工具来看看是件好事。

        【讨论】:

        • 所有仍然使用 PS 并且仅用于确定观察到的顶级内存的方法。不是真正的顶级内存。你总是会在一个间隔和另一个间隔之间错过一些东西。
        • memusg 脚本的输出单位是什么?字节?千字节?
        • @DanielStandage:可能以千字节为单位。它只是观察我的 BSD 手册页中 ps -o rss= 显示的值,其中 rss 是 进程的实际内存(驻留集)大小(以 1024 字节为单位)
        • @gcb 那么,这就是您测量样品时得到的结果。
        • 答案中给出的 memusg 链接似乎已损坏。无论如何,/usr/bin/time 做得很好。
        【解决方案8】:

        【讨论】:

          【解决方案9】:

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

          #!/usr/bin/env bash
          
          pid=$1
          
          while ps $pid >/dev/null
          do
              ps -o vsz= ${pid}
              sleep 1
          done | sort -n | tail -n1
          

          示例用法:

          max_mem_usage.sh 23423
          

          【讨论】:

            【解决方案10】:

            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

            这会显着减慢您的命令速度。

            【讨论】:

            • 方便的脚本,但我需要 sort -g 在我的 Slackware 系统上(我假设您正在寻找最高值)。
            • 我在 centos 5.5 发行版的 valgrind-3.5.0 中缺少 --pages-as-heap 选项。 --trace-children 也可能是 valgrind 的有用选项。我不确定它的作用,但我猜它也会跟踪子进程。
            • +1 表示valgrind --massif。您还可以使用它附带的ms_print 工具进行方便的输出(包括随时间变化的 ascii 图表)
            • Massif 的开销比 time 高得多,在像 ls 这样的命令上花费至少 10 倍以上的时间。
            • 确实太大了。这个答案应该提到减速。我要测量的命令通常需要 35 秒才能完成。半个多小时前我已经运行了这个valgrind命令来测量它,它仍然没有完成......
            【解决方案11】:

            在 MacOS Sierra 上使用:

            /usr/bin/time -l commandToMeasure
            

            你可以使用grep来获取你想要的东西。

            【讨论】:

            • 这个!我确实花了一个小时试图让 Instruments.app 和 dtrace 给我一个内存配置文件,并打开系统完整性(无法关闭它),而我只需要这个简单的命令。一个小提示,您可以使用command time -l 而不是/usr/bin/time -l,这将导致您的shell 实际上调用一个名为time 的二进制文件而不是内置函数。 (是的,command 不是占位符,command timetime 不同。)
            【解决方案12】:

            'htop' 是查看哪个进程正在使用多少 RAM 的最佳命令.....

            了解更多详情 http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

            【讨论】:

            • htop 没有列出 PEAK 使用情况。只有当前使用情况。 (除非你知道一些我不知道的事情。正如我昨天在 htop 中看到的那样。)
            【解决方案13】:

            Heaptrack 是具有 GUI 和文本界面的 KDE 工具。我发现它比 valgrind 更适合理解进程的内存使用情况,因为它提供了更多细节和火焰图。它也更快,因为它对 valgrind 的检查更少。它还为您提供了峰值内存使用率。

            无论如何,跟踪 rss 和 vss 具有误导性,因为页面可以共享,这就是 memusg 的原因。您真正应该做的是在/proc/[pid]/smaps 中跟踪Pss 的总和或使用pmapGNOME system-monitor曾经这样做过,但是太贵了。

            【讨论】:

              【解决方案14】:

              使用手工制作的 bash 脚本重新发明轮子。又快又干净。

              我的用例:我想监控一台 RAM 较少的 linux 机器,并希望在它在高负载下运行时为每个容器的使用情况拍摄快照。

              #!/usr/bin/env bash
              
              threshold=$1
              
              echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."
              
              while(true)
                  freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
                do
              
                if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
                then
                     echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
                     free -m
                     docker stats --no-stream
                     sleep 60  
                     echo ""  
                else
                     echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
                fi
                sleep 30
              
              done
              

              样本输出:

              2017-10-12 13:29:33:以 30% 的阈值运行空闲内存监视器..

              2017-10-12 13:29:33:可用内存充足:69.4567%

              2017-10-12 13:30:03:可用内存充足:69.4567%

              2017-10-12 16:47:02:可用内存 18.9387% 小于 30%

              您的自定义命令输出

              【讨论】:

                【解决方案15】:

                在 Linux 上:

                使用/usr/bin/time -v &lt;program&gt; &lt;args&gt; 并查找“Maximum resident set size”。

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

                例如:

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

                在 BSD、MacOS 上:

                使用/usr/bin/time -l &lt;program&gt; &lt;args&gt;,寻找“最大驻留集大小”:

                >/usr/bin/time -l ./myapp
                        0.01 real         0.00 user         0.00 sys
                      1440  maximum resident set size
                      . . .
                

                【讨论】:

                【解决方案16】:

                在 macOS 上,您可以改用 DTrace。 “Instruments”应用程序是一个很好的 GUI,它带有 XCode afaik。

                【讨论】:

                  【解决方案17】:
                  time -f '%M' <run_program>
                  

                  【讨论】:

                  • 输出以千字节为单位(可能是千字节?)。请注意,在 bash 中,您需要指定完整路径,例如/usr/bin/time,为了不使用不支持-f的内置time关键字。
                  【解决方案18】:

                  请务必回答问题。提供详细信息并分享您的研究!

                  对不起,我是第一次来,只能问问题……

                  使用建议:

                  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
                  

                  然后:

                  grep mem_heap_B massif.out
                  ...
                  mem_heap_B=1150976
                  mem_heap_B=1150976
                  ...
                  

                  这与top 命令在类似时刻显示的非常不同:

                  14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com
                  

                  Valgrind 的测量单位是什么??

                  /usr/bin/time -v ./test.sh 从未回答 — 您必须直接将可执行文件提供给 /usr/bin/time,例如:

                  /usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212
                  
                  
                      Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"
                  
                      User time (seconds): 1468.44
                      System time (seconds): 7.37
                      Percent of CPU this job got: 99%
                      Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
                      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): 574844
                      Average resident set size (kbytes): 0
                      Major (requiring I/O) page faults: 74
                      Minor (reclaiming a frame) page faults: 468880
                      Voluntary context switches: 1190
                      Involuntary context switches: 20534
                      Swaps: 0
                      File system inputs: 81128
                      File system outputs: 1264
                      Socket messages sent: 0
                      Socket messages received: 0
                      Signals delivered: 0
                      Page size (bytes): 4096
                      Exit status: 0
                  

                  【讨论】:

                    【解决方案19】:

                    这是一个单行程序,不需要任何外部脚本或实用程序,也不需要您通过 Valgrind 或 time 等其他程序启动进程,因此您可以将其用于任何已经运行的进程:

                    grep ^VmPeak /proc/$PID/status
                    

                    (将$PID替换为您感兴趣的进程的PID)

                    【讨论】:

                    • 如果我不知道 PID 怎么办?例如,如果程序运行时间很短(
                    • “VmHWM:Peak resident set size”可能更适合测量 RAM 使用情况(而不是 VmPeak,它也包含许多其他内容)。
                    • @jfs 这真的取决于你想知道什么。 IIRC VmPeak 是包括虚拟内存在内的最大总内存使用量,而 VmHWM 是峰值 RAM 使用量。因此,如果您想知道程序要求的内存总量,请使用 VmPeak;如果您想知道它在给定时间使用了多少实际 RAM,请使用 VmHWM。
                    • @diralik 如果您正在检查自己编写的程序,您可以嵌入一行代码来查看“/proc/self/status”文件。
                    • 如果您的操作系统运行 64 位操作系统,VmPeak 应该没什么大不了的。是VmHWM 导致系统内存不足。在用完实际 RAM 之前,在 64 位操作系统上用完虚拟内存是闻所未闻的。
                    【解决方案20】:

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

                    busybox time -v uname -r
                    

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

                    sudo pacman -S busybox
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-12-02
                      • 2013-03-20
                      • 2016-05-07
                      • 1970-01-01
                      • 2014-04-11
                      相关资源
                      最近更新 更多