Linux/Unix进程的最高内存使用率

486

是否有一种工具可以运行命令行并报告最高 RAM 使用总量?

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

20个回答

13

由于许多现代发行版中没有 /usr/bin/time(使用 Bash 内置的 time 代替),因此您可以使用 Busybox 的 time 实现并带上 -v 参数:

因为 /usr/bin/time 在许多现代的 Linux 发行版中已经不存在了(取而代之的是 Bash 内置的 time 命令),所以你可以通过加上 -v 参数来使用 Busybox 的 time 实现。

busybox time -v uname -r

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

sudo pacman -S busybox

今天在GitHub Actions上似乎可以正常工作了。这是帮助排除构建问题的好方法。 - HarlemSquirrel

9

如果你想展示内存峰值和更深入的统计信息,我建议使用像valgrind这样的性能分析工具。一个不错的valgrind前端是alleyoop


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

用法示例:

max_mem_usage.sh 23423

5
您可以使用类似 Valgrind 的工具来完成此操作。

2
Heaptrack是KDE工具,具有GUI和文本界面。我发现它比valgrind更适合理解进程的内存使用情况,因为它提供了更多的细节和火焰图。它也更快,因为它进行的检查比valgrind少。并且它可以给你峰值内存使用量。
无论如何,跟踪rss和vss是误导性的,因为页面可能是共享的,这就是为什么要使用memusg。你真正应该做的是跟踪/proc/[pid]/smapsPss的总和,或者使用pmapGNOME system-monitor曾经这样做,但代价太高了。

1
重新发明轮子,使用手工制作的bash脚本。快速而干净。 我的用例:我想监视一台内存较少的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%

您自定义命令的输出



1
在 macOS 上,您可以使用 DTrace。 "Instruments" 应用程序是一个很好的 GUI 工具,我认为它随 XCode 一起提供。

-1

3
htop不会列出峰值使用情况,仅列出当前使用情况。(除非你知道我不知道的东西。因为昨天我在htop中查找了这种情况。) - Katastic Voyage

-4
请确保回答问题。提供详细信息并分享您的研究!
抱歉,我第一次来这里,只能提出问题...
使用建议:
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

请将后续问题作为评论发布到原始帖子中。 - jorisw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接