调用并跟踪一个进程的内存使用情况


14

我想运行一个消耗内存的程序,并随时间跟踪其内存使用情况。程序在调用后几秒钟后结束。

前一个问题建议使用sysstat软件包。尽管它的pidstat实用程序部分满足了我的要求,但它不能满足我的两个需求:

  • 它接受的最小间隔1s,但是我想以更短的粒度进行测量。(0.1s应该没问题)
  • 它仅跟踪现有过程,而我却不能总是在场以复制并粘贴该pid。

是否有一些替代脚本/实用程序可以更好地执行调用和测量工作?


1
听起来您应该编写一个简单的Python或Bash小脚本来转储进程的内存使用情况(您可以只查看中的第一个整数/proc/$PID/statm),然后休眠100ms并重复执行。为什么你不能只是不断扔PID的相关statm经过cat,也许使用一些正则表达式来过滤掉多余/不需要的价值观,只是做了sleep 0.01?某些操作系统不允许使用亚秒级的sleep值,因此在这种情况下,您必须采用Python路由(而应使用Python的内置time库进行睡眠)。
突破

有很多方法
消除

Answers:


11

这应该做您需要的。它从获取信息/proc/$PID/statm并打印(从man procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

剧本:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

然后,您可以调用脚本,并为其指定一个进程名称。例如:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

笔记:

  • 这是假设只有一个单一的与指定的名称正在运行的进程。

@björnen谢谢您的编辑。您说的很对,我在这里错了man,不知道为什么您的编辑被拒绝了。

1

多年后,我发现valgrind(也)有一个用于此的工具:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

注意:valgrind的作用不只是观察:它需要注入一些代码并获取内存快照。这可能会损害统计的准确性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.