如何衡量Linux中应用程序或进程的内存使用情况?

在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。

为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。

(注:这里详细介绍了这个问题。)


当前回答

使用时间。

不是Bash内置时间,而是您可以找到的时间,例如/usr/bin/time。

下面是它的内容,在一个简单的ls上:

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
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: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): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

其他回答

/prox/xxx/numa_maps提供了一些信息:N0=???N1=???。但这个结果可能低于实际结果,因为它只计算那些被触摸过的对象。

在最新版本的Linux中,使用smaps子系统。例如,对于PID为1234的进程:

cat /proc/1234/smaps

它会确切地告诉你当时它使用了多少内存。更重要的是,它将把内存分为私有和共享,这样你就可以知道你的程序实例使用了多少内存,而不包括程序的多个实例之间共享的内存。

如果您想要比使用Valgrind进行评测更快的东西,并且您的内核更旧,而且您不能使用smaps,那么一个带有显示进程驻留集选项的ps(使用ps-o rss,命令)可以让您快速、合理地了解所使用的非交换内存的实际数量。

很难确定,但有两件“接近”的事情可以帮助我们。

$ ps aux

将为您提供虚拟大小(VSZ)

您还可以通过转到/proc/$pid/status从/proc文件系统获取详细的统计信息。

最重要的是VmSize,它应该接近ps aux给出的值。

/proc/19420$ cat status
Name:      firefox
State:     S (sleeping)
Tgid:      19420
Pid:       19420
PPid:      1
TracerPid: 0
Uid:       1000    1000    1000    1000
Gid:       1000    1000    1000    1000
FDSize:    256
Groups:    4 6 20 24 25 29 30 44 46 107 109 115 124 1000
VmPeak:    222956 kB
VmSize:    212520 kB
VmLck:          0 kB
VmHWM:     127912 kB
VmRSS:     118768 kB
VmData:    170180 kB
VmStk:        228 kB
VmExe:         28 kB
VmLib:      35424 kB
VmPTE:        184 kB
Threads:   8
SigQ:      0/16382
SigPnd:    0000000000000000
ShdPnd:    0000000000000000
SigBlk:    0000000000000000
SigIgn:    0000000020001000
SigCgt:    000000018000442f
CapInh:    0000000000000000
CapPrm:    0000000000000000
CapEff:    0000000000000000
Cpus_allowed:    03
Mems_allowed:    1
voluntary_ctxt_switches:    63422
nonvoluntary_ctxt_switches: 7171

虽然这个问题似乎是关于检查当前运行的进程,但我希望看到应用程序从头到尾使用的峰值内存。除了Valgrind,您还可以使用tstime,这要简单得多。它测量“高潮”内存使用情况(RSS和虚拟)。根据这个答案。