如何测量应用程序或进程的实际内存使用情况?

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

了解Linux上的内存使用情况的博客文章中,ps不是用于此目的的准确工具。

为什么ps是“错误的”

取决于你如何看待它,ps并没有报告进程的真实内存使用情况。它真正做的是显示每个进程将占用多少真实内存如果它是唯一运行的进程。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误

(注意:这个问题是覆盖在这里非常详细。

1385104 次浏览

使用ps或类似的工具,您将只能获得该进程分配的内存页数。这个数字是正确的,但是:

  • 不反映应用程序使用的实际内存量,仅反映为其保留的内存量

  • 如果页面被共享,例如由多个线程或使用动态链接的库,可能会产生误导

如果你真的想知道你的应用程序实际使用了多少内存,你需要在分析器中运行它。例如,Valgrind可以让你了解使用的内存量,更重要的是,了解程序中可能的内存泄漏。Valgrind的堆分析器工具称为“massif”:

Massif是一个堆分析器。它通过定期拍摄程序堆的快照来执行详细的堆分析。它生成一个图表,显示一段时间内的堆使用情况,包括有关程序中哪些部分负责最多内存分配的信息。该图由文本或超文本标记语言文件补充,该文件包含更多用于确定分配最多内存的位置的信息。Massif运行程序比正常速度慢20倍左右。

Valgrind留档中所述,您需要通过Valgrind运行程序:

valgrind --tool=massif <executable> <arguments>

Massif写入内存使用快照的转储(例如massif.out.12345)。这些快照提供(1)内存使用的时间表,(2)每个快照记录程序内存分配的位置。分析这些文件的一个很棒的图形工具是地块可视化器。但我发现ms_print已经有了很大的帮助,它是Valgrind附带的一个简单的基于文本的工具。

要查找内存泄漏,请使用valgrind的(默认)memcheck工具。

很难确定,但这里有两件“接近”的事情可以提供帮助。

$ ps aux

将为您提供虚拟尺寸(VSZ)

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

最重要的是Vmsize,它应该接近ps aux给出的大小。

/proc/19420$ cat statusName:      firefoxState:     S (sleeping)Tgid:      19420Pid:       19420PPid:      1TracerPid: 0Uid:       1000    1000    1000    1000Gid:       1000    1000    1000    1000FDSize:    256Groups:    4 6 20 24 25 29 30 44 46 107 109 115 124 1000VmPeak:    222956 kBVmSize:    212520 kBVmLck:          0 kBVmHWM:     127912 kBVmRSS:     118768 kBVmData:    170180 kBVmStk:        228 kBVmExe:         28 kBVmLib:      35424 kBVmPTE:        184 kBThreads:   8SigQ:      0/16382SigPnd:    0000000000000000ShdPnd:    0000000000000000SigBlk:    0000000000000000SigIgn:    0000000020001000SigCgt:    000000018000442fCapInh:    0000000000000000CapPrm:    0000000000000000CapEff:    0000000000000000Cpus_allowed:    03Mems_allowed:    1voluntary_ctxt_switches:    63422nonvoluntary_ctxt_switches: 7171

获取Valgrind。让它运行你的程序,它会告诉你很多关于它的内存使用情况。

这仅适用于程序运行一段时间并停止的情况。我不知道Valgrind是否可以处理已经运行的进程或不应该停止进程,例如守护进程。

没有简单的方法来计算这个问题。但是有些人试图得到一些好的答案:

这里再次投票支持Valgrind,但我想补充一点,您可以使用Alleyoop这样的工具来帮助您解释Valgrind生成的结果。

我一直在使用这两个工具,并且总是有精益、非泄漏的代码来自豪地展示它;)

对此没有一个单一的答案,因为您无法精确指出进程使用的内存量。Linux下的大多数进程都使用共享库。

例如,假设您想计算ls进程的内存使用情况。您只计算可执行文件ls使用的内存(如果可以隔离它)吗?libc呢?或者运行ls所需的所有其他库?

linux-gate.so.1 =>  (0x00ccb000)librt.so.1 => /lib/librt.so.1 (0x06bc7000)libacl.so.1 => /lib/libacl.so.1 (0x00230000)libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)libc.so.6 => /lib/libc.so.6 (0x00b40000)libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)/lib/ld-linux.so.2 (0x00b1d000)libattr.so.1 => /lib/libattr.so.1 (0x00229000)libdl.so.2 => /lib/libdl.so.2 (0x00cae000)libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

您可以争辩说它们是由其他进程共享的,但是如果没有加载它们,“ls”就不能在系统上运行。

此外,如果您需要知道进程需要多少内存来进行容量规划,您必须计算进程的每个额外副本使用多少内存。我认为/proc/PID/status可能会一次为您提供足够的内存使用信息。另一方面,Valgrind会让您更好地了解程序整个生命周期的内存使用情况。

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

cat /proc/1234/smaps

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

如果您想要比使用Valgrind进行分析更快的东西,并且您的内核较旧并且无法使用smaps,那么带有显示进程驻留集(带有ps -o rss,command)的选项的ps可以为您提供快速合理的_aproximation_正在使用的非交换内存的实际数量。

这是对工具和问题的极好总结:archive.org链接

我会引用它,以便更多的开发人员真正阅读它。

如果你想分析整个系统的内存使用情况,或者彻底分析一个应用程序的内存使用情况(不仅仅是堆的使用情况),请使用exmap。对于整个系统分析,找到有效使用率最高的进程,它们实际上占用了最多的内存,找到可写使用率最高的进程,它们创建了最多的数据(因此可能泄漏或在数据使用方面非常无效)。选择这样的应用程序并在第二个列表视图中分析它的映射。有关更多详细信息,请参阅exmap部分。还要使用xreStop来检查X资源的高使用率,特别是当X服务器的进程占用大量内存时。有关详细信息,请参阅xreStop部分。

如果您想检测泄漏,请使用Valgrind或可能的kmTrace

如果您想分析应用程序的堆(malloc等)使用情况,请在memprofkmTrace中运行它,分析应用程序并在函数调用树中搜索最大的分配。有关更多详细信息,请参阅他们的部分。

Valgrind可以显示详细信息,但它减缓的目标应用程序显着,并且大多数时候它会改变应用程序的行为。

Exmap是我还不知道的东西,但似乎你需要内核模块来获取信息,这可能是一个障碍。

我假设每个人都想知道关于“内存使用”的以下内容…Linux,单个进程可能使用的物理内存量可以大致分为以下几类。

  • M.一个匿名映射内存

  • . p私有

    • . d脏==malloc/映射堆和堆栈分配和写入内存
    • . c Clean==malloc/映射的堆和堆栈内存一旦分配、写入,然后释放,但尚未回收
  • 共享

    • . d脏==malloc/mmaped堆可以获得写入时复制并在进程之间共享(编辑)
    • . c干净==malloc/mmaped堆可以获得写入时复制并在进程之间共享(编辑)
  • M. n命名映射内存

  • . p私有

    • . d脏==文件映射写入内存私有
    • . c干净==映射程序/库文本私有映射
  • 共享

    • . d脏==文件映射写入共享内存
    • . c干净==映射库文本共享映射

Android中包含的名为showmap的实用程序非常有用

virtual                    shared   shared   private  privatesize     RSS      PSS      clean    dirty    clean    dirty    object-------- -------- -------- -------- -------- -------- -------- ------------------------------4        0        0        0        0        0        0 0:00 0                  [vsyscall]4        4        0        4        0        0        0                         [vdso]88       28       28        0        0        4       24                         [stack]12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.72064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so3752     2736     2736        0        0      864     1872                         [heap]24       24       24        0        0        0       24 [anon]916      616      131      584        0        0       32                         /bin/bash-------- -------- -------- -------- -------- -------- -------- ------------------------------22816     4004     3005     1116        0      876     2012 TOTAL

尝试pmap命令:

sudo pmap -x <process pid>

如果您的代码是C或C++您可以使用getrusage(),它会返回有关进程内存和时间使用情况的各种统计信息。

但并非所有平台都支持此功能,并且将为内存使用选项返回0值。

相反,您可以查看在/proc/[pid]/statm中创建的虚拟文件(其中[pid]被您的进程ID替换。您可以从getpid()获得它)。

此文件看起来像一个包含7个整数的文本文件。您可能最感兴趣的是此文件中的第一个(所有内存使用)和第六个(数据内存使用)数字。

对“真实世界”用法的一个很好的测试是打开应用程序,运行vmstat -s,检查“活动内存”统计信息。关闭应用程序,等待几秒钟,然后再次运行vmstat -s

无论释放了多少活动内存,应用程序显然都在使用。

#!/bin/ksh## Returns total memory used by process $1 in kb.## See /proc/NNNN/smaps if you want to do something# more interesting.#
IFS=$'\n'
for line in $(</proc/$1/smaps)do[[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))done
print $kb

我正在使用htop;它是一个非常好的控制台程序,类似于Windows任务管理器

使用s mem,它是ps的替代方案,它计算每个进程的USS和PSS。您可能想要PSS。

  • USS-唯一设置大小。这是该进程独有的非共享内存量(将其视为独特内存的U)。它不包括共享内存。因此,这将根据-报告进程使用的内存量,但当您想忽略共享内存时,它很有帮助。

  • PSS-比例设置大小。这就是你想要的。它将唯一内存(USS)加上其共享内存的比例除以共享该内存的进程数。因此,它将给你一个准确的表示每个进程使用了多少实际物理内存-共享内存真正表示为共享。想想P物理内存。

这与ps和其他实用程序报告的RSS相比如何:

  • rss-驻留设置大小。这是每个进程使用的共享内存加上未共享内存的量。如果任何进程共享内存,这将超过-报告实际使用的内存量,因为相同的共享内存将被多次计数-再次出现在共享相同内存的每个其他进程中。因此,它相当不可靠,特别是当高内存进程有很多分叉时——这在服务器中很常见,比如Apache或PHP(FastCGI/FPM)进程。

注意:smem还可以(可选)输出饼图等图形。在我看来,你不需要这些。如果你只想像使用ps -A v一样从命令行使用它,那么你不需要安装Python和Matplotlib推荐的依赖项。

下面的命令行将为您提供在Linux机器上运行的各种进程使用的总内存,单位为MB:

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'

如果进程没有占用太多内存(要么是因为您希望出现这种情况,要么是其他一些命令已经给出了这个初始指示),并且进程可以承受短时间的停止,您可以尝试使用gcore命令。

gcore <pid>

检查生成的核心文件的大小,以了解特定进程正在使用多少内存。

如果进程使用数百兆字节或千兆字节,这将无法很好地工作,因为创建核心生成可能需要几秒钟或几分钟,具体取决于I/O性能。在创建核心期间,进程会停止(或“冻结”)以防止内存更改。所以要小心。

还要确保生成核心的挂载点有足够的磁盘空间,并且系统不会对在该特定目录中创建的核心文件做出负面反应。

检查此外壳脚本以检查Linux中应用程序的内存使用情况

它也是在github上可用和版本没有糊和bc

我建议您使用atop。您可以在此页面上找到有关它的所有信息。它能够为您的流程提供所有必要的KPI,也可以捕获到文件中。

注:只有当内存消耗增加时,这才能100%正常工作

如果您想通过给定进程(或共享公共名称的已处理组,例如google-chrome)监控内存使用情况,您可以使用我的bash-cript:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

这将不断寻找变化并打印它们。

在此输入图片描述

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

使用Ubuntu中可用的内置系统监视器 GUI工具。

除了答案中列出的解决方案之外,您还可以使用Linux命令“top”。它提供了正在运行的系统的动态实时视图,并以百分比的形式给出了整个系统以及每个程序的CPU和内存使用量:

top

通过程序PID过滤:

top -p <PID>

按程序名称过滤:

top | grep <PROCESS NAME>

“top”还提供了一些字段,例如:

VIRT--Virtual Image(kb):任务使用的虚拟内存总量

RES--驻留大小(kb):任务使用的非交换物理内存;RES=CODE+DATA。

数据+堆栈大小(kb):用于执行代码以外的物理内存量,也称为“数据驻留集”大小或DRS。

SHR--共享内存大小(kb):任务使用的共享内存量。它只是反映可能与其他进程共享的内存。

参考这里

使用time

不是Bash内置的time,而是你可以用which time找到的,例如/usr/bin/time

这是它涵盖的内容,在一个简单的ls上:

$ /usr/bin/time --verbose ls(...)Command being timed: "ls"User time (seconds): 0.00System time (seconds): 0.00Percent of CPU this job got: 0%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 2372Average resident set size (kbytes): 0Major (requiring I/O) page faults: 1Minor (reclaiming a frame) page faults: 121Voluntary context switches: 2Involuntary context switches: 9Swaps: 0File system inputs: 256File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

基于对相关问题的回答

您可以使用SNMP来获取网络上特定设备中进程的内存和CPU使用率:)

职位要求:

  • 运行该进程的设备应安装并运行snmp
  • snmp应该配置为接受来自您将运行以下脚本的请求(它可以在文件snmpd.conf中配置)
  • 您应该知道要监视的进程的进程ID(PID)

备注:

  • HOST-RESOURCES-MIB::hrSWRunPERCPU是此进程消耗的总系统CPU资源的百秒数。请注意,在多处理器系统上,此值可能会在一个百秒的实际(挂钟)时间内增加超过一个百秒。

  • HOST-RESOURCES-MIB::hrSWRunDeletMem是分配给此进程的实际系统内存总量。

进程监控脚本

echo "IP address: "read ipecho "Specfiy PID: "read pidecho "Interval in seconds: "read interval
while [ 1 ]dodatesnmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pidsnmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pidsleep $interval;done

还有三种方法可以尝试:

  1. ps aux --sort pmem
    它按%MEM对输出进行排序。
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    它使用管道进行排序。
  3. top -a
    它以%MEM
  4. 开始顶部排序

(摘自

/prox/xxx/numa_maps给出了一些信息:N0=???N1=???。但是这个结果可能低于实际结果,因为它只计算那些被触及的结果。

ps -eo size,pid,user,command --sort -size | \awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\cut -d "" -f2 | cut -d "-" -f1

将其用作root,您可以获得每个进程使用内存的清晰输出。

输出示例:

     0.00 Mb COMMAND1288.57 Mb /usr/lib/firefox821.68 Mb /usr/lib/chromium/chromium762.82 Mb /usr/lib/chromium/chromium588.36 Mb /usr/sbin/mysqld547.55 Mb /usr/lib/chromium/chromium523.92 Mb /usr/lib/tracker/tracker476.59 Mb /usr/lib/chromium/chromium446.41 Mb /usr/bin/gnome421.62 Mb /usr/sbin/libvirtd405.11 Mb /usr/lib/chromium/chromium302.60 Mb /usr/lib/chromium/chromium291.46 Mb /usr/lib/chromium/chromium284.56 Mb /usr/lib/chromium/chromium238.93 Mb /usr/lib/tracker/tracker223.21 Mb /usr/lib/chromium/chromium197.99 Mb /usr/lib/chromium/chromium194.07 Mb conky191.92 Mb /usr/lib/chromium/chromium190.72 Mb /usr/bin/mongod169.06 Mb /usr/lib/chromium/chromium155.11 Mb /usr/bin/gnome136.02 Mb /usr/lib/chromium/chromium125.98 Mb /usr/lib/chromium/chromium103.98 Mb /usr/lib/chromium/chromium93.22 Mb /usr/lib/tracker/tracker89.21 Mb /usr/lib/gnome80.61 Mb /usr/bin/gnome77.73 Mb /usr/lib/evolution/evolution76.09 Mb /usr/lib/evolution/evolution72.21 Mb /usr/lib/gnome69.40 Mb /usr/lib/evolution/evolution68.84 Mb nautilus68.08 Mb zeitgeist60.97 Mb /usr/lib/tracker/tracker59.65 Mb /usr/lib/evolution/evolution57.68 Mb apt55.23 Mb /usr/lib/gnome53.61 Mb /usr/lib/evolution/evolution53.07 Mb /usr/lib/gnome52.83 Mb /usr/lib/gnome51.02 Mb /usr/lib/udisks2/udisksd50.77 Mb /usr/lib/evolution/evolution50.53 Mb /usr/lib/gnome50.45 Mb /usr/lib/gvfs/gvfs50.36 Mb /usr/lib/packagekit/packagekitd50.14 Mb /usr/lib/gvfs/gvfs48.95 Mb /usr/bin/Xwayland :102446.21 Mb /usr/bin/gnome42.43 Mb /usr/bin/zeitgeist42.29 Mb /usr/lib/gnome41.97 Mb /usr/lib/gnome41.64 Mb /usr/lib/gvfs/gvfsd41.63 Mb /usr/lib/gvfs/gvfsd41.55 Mb /usr/lib/gvfs/gvfsd41.48 Mb /usr/lib/gvfs/gvfsd39.87 Mb /usr/bin/python /usr/bin/chrome37.45 Mb /usr/lib/xorg/Xorg vt236.62 Mb /usr/sbin/NetworkManager35.63 Mb /usr/lib/caribou/caribou34.79 Mb /usr/lib/tracker/tracker33.88 Mb /usr/sbin/ModemManager33.77 Mb /usr/lib/gnome33.61 Mb /usr/lib/upower/upowerd33.53 Mb /usr/sbin/gdm333.37 Mb /usr/lib/gvfs/gvfsd33.36 Mb /usr/lib/gvfs/gvfs33.23 Mb /usr/lib/gvfs/gvfs33.15 Mb /usr/lib/at33.15 Mb /usr/lib/at30.03 Mb /usr/lib/colord/colord29.62 Mb /usr/lib/apt/methods/https28.06 Mb /usr/lib/zeitgeist/zeitgeist27.29 Mb /usr/lib/policykit25.55 Mb /usr/lib/gvfs/gvfs25.55 Mb /usr/lib/gvfs/gvfs25.23 Mb /usr/lib/accountsservice/accounts25.18 Mb /usr/lib/gvfs/gvfsd25.15 Mb /usr/lib/gvfs/gvfs25.15 Mb /usr/lib/gvfs/gvfs25.12 Mb /usr/lib/gvfs/gvfs25.10 Mb /usr/lib/gnome25.10 Mb /usr/lib/gnome25.07 Mb /usr/lib/gvfs/gvfsd24.99 Mb /usr/lib/gvfs/gvfs23.26 Mb /usr/lib/chromium/chromium22.09 Mb /usr/bin/pulseaudio19.01 Mb /usr/bin/pulseaudio18.62 Mb (sd18.46 Mb (sd18.30 Mb /sbin/init18.17 Mb /usr/sbin/rsyslogd17.50 Mb gdm17.42 Mb gdm17.09 Mb /usr/lib/dconf/dconf17.09 Mb /usr/lib/at17.06 Mb /usr/lib/gvfs/gvfsd16.98 Mb /usr/lib/at16.91 Mb /usr/lib/gdm3/gdm16.86 Mb /usr/lib/gvfs/gvfsd16.86 Mb /usr/lib/gdm3/gdm16.85 Mb /usr/lib/dconf/dconf16.85 Mb /usr/lib/dconf/dconf16.73 Mb /usr/lib/rtkit/rtkit16.69 Mb /lib/systemd/systemd13.13 Mb /usr/lib/chromium/chromium13.13 Mb /usr/lib/chromium/chromium10.92 Mb anydesk8.54 Mb /sbin/lvmetad7.43 Mb /usr/sbin/apache26.82 Mb /usr/sbin/apache26.77 Mb /usr/sbin/apache26.73 Mb /usr/sbin/apache26.66 Mb /usr/sbin/apache26.64 Mb /usr/sbin/apache26.63 Mb /usr/sbin/apache26.62 Mb /usr/sbin/apache26.51 Mb /usr/sbin/apache26.25 Mb /usr/sbin/apache26.22 Mb /usr/sbin/apache23.92 Mb bash3.14 Mb bash2.97 Mb bash2.95 Mb bash2.93 Mb bash2.91 Mb bash2.86 Mb bash2.86 Mb bash2.86 Mb bash2.84 Mb bash2.84 Mb bash2.45 Mb /lib/systemd/systemd2.30 Mb (sd2.28 Mb /usr/bin/dbus1.84 Mb /usr/bin/dbus1.46 Mb ps1.21 Mb openvpn hackthebox.ovpn1.16 Mb /sbin/dhclient1.16 Mb /sbin/dhclient1.09 Mb /lib/systemd/systemd0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data0.97 Mb /lib/systemd/systemd0.96 Mb /lib/systemd/systemd0.89 Mb /usr/sbin/smartd0.77 Mb /usr/bin/dbus0.76 Mb su0.76 Mb su0.76 Mb su0.76 Mb su0.76 Mb su0.76 Mb su0.75 Mb sudo su0.75 Mb sudo su0.75 Mb sudo su0.75 Mb sudo su0.75 Mb sudo su0.75 Mb sudo su0.74 Mb /usr/bin/dbus0.71 Mb /usr/lib/apt/methods/http0.68 Mb /bin/bash /usr/bin/mysqld_safe0.68 Mb /sbin/wpa_supplicant0.66 Mb /usr/bin/dbus0.61 Mb /lib/systemd/systemd0.54 Mb /usr/bin/dbus0.46 Mb /usr/sbin/cron0.45 Mb /usr/sbin/irqbalance0.43 Mb logger0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }0.40 Mb /usr/bin/ssh0.34 Mb /usr/lib/chromium/chrome0.32 Mb cut0.32 Mb cut0.00 Mb [kthreadd]0.00 Mb [ksoftirqd/0]0.00 Mb [kworker/0:0H]0.00 Mb [rcu_sched]0.00 Mb [rcu_bh]0.00 Mb [migration/0]0.00 Mb [lru0.00 Mb [watchdog/0]0.00 Mb [cpuhp/0]0.00 Mb [cpuhp/1]0.00 Mb [watchdog/1]0.00 Mb [migration/1]0.00 Mb [ksoftirqd/1]0.00 Mb [kworker/1:0H]0.00 Mb [cpuhp/2]0.00 Mb [watchdog/2]0.00 Mb [migration/2]0.00 Mb [ksoftirqd/2]0.00 Mb [kworker/2:0H]0.00 Mb [cpuhp/3]0.00 Mb [watchdog/3]0.00 Mb [migration/3]0.00 Mb [ksoftirqd/3]0.00 Mb [kworker/3:0H]0.00 Mb [kdevtmpfs]0.00 Mb [netns]0.00 Mb [khungtaskd]0.00 Mb [oom_reaper]0.00 Mb [writeback]0.00 Mb [kcompactd0]0.00 Mb [ksmd]0.00 Mb [khugepaged]0.00 Mb [crypto]0.00 Mb [kintegrityd]0.00 Mb [bioset]0.00 Mb [kblockd]0.00 Mb [devfreq_wq]0.00 Mb [watchdogd]0.00 Mb [kswapd0]0.00 Mb [vmstat]0.00 Mb [kthrotld]0.00 Mb [ipv6_addrconf]0.00 Mb [acpi_thermal_pm]0.00 Mb [ata_sff]0.00 Mb [scsi_eh_0]0.00 Mb [scsi_tmf_0]0.00 Mb [scsi_eh_1]0.00 Mb [scsi_tmf_1]0.00 Mb [scsi_eh_2]0.00 Mb [scsi_tmf_2]0.00 Mb [scsi_eh_3]0.00 Mb [scsi_tmf_3]0.00 Mb [scsi_eh_4]0.00 Mb [scsi_tmf_4]0.00 Mb [scsi_eh_5]0.00 Mb [scsi_tmf_5]0.00 Mb [bioset]0.00 Mb [kworker/1:1H]0.00 Mb [kworker/3:1H]0.00 Mb [kworker/0:1H]0.00 Mb [kdmflush]0.00 Mb [bioset]0.00 Mb [kdmflush]0.00 Mb [bioset]0.00 Mb [jbd2/sda50.00 Mb [ext40.00 Mb [kworker/2:1H]0.00 Mb [kauditd]0.00 Mb [bioset]0.00 Mb [drbd0.00 Mb [irq/270.00 Mb [i915/signal:0]0.00 Mb [i915/signal:1]0.00 Mb [i915/signal:2]0.00 Mb [ttm_swap]0.00 Mb [cfg80211]0.00 Mb [kworker/u17:0]0.00 Mb [hci0]0.00 Mb [hci0]0.00 Mb [kworker/u17:1]0.00 Mb [iprt0.00 Mb [iprt0.00 Mb [kworker/1:0]0.00 Mb [kworker/3:0]0.00 Mb [kworker/0:0]0.00 Mb [kworker/2:0]0.00 Mb [kworker/u16:0]0.00 Mb [kworker/u16:2]0.00 Mb [kworker/3:2]0.00 Mb [kworker/2:1]0.00 Mb [kworker/1:2]0.00 Mb [kworker/0:2]0.00 Mb [kworker/2:2]0.00 Mb [kworker/0:1]0.00 Mb [scsi_eh_6]0.00 Mb [scsi_tmf_6]0.00 Mb [usb0.00 Mb [bioset]0.00 Mb [kworker/3:1]0.00 Mb [kworker/u16:1]

我正在使用ArchLinux,有一个名为ps_mem的精彩包:

ps_mem -p <pid>

示例输出

$ ps_mem -S -p $(pgrep firefox)
Private   +   Shared  =  RAM used   Swap used   Program
355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox---------------------------------------------393.7 MiB    35.9 MiB=============================================

给出了一些答案(感谢thomasutter),为了获得单个应用程序的实际交换和RAM,我想出了以下内容,说我们想知道“Firefox”在使用什么

sudo smem | awk '/firefox/{swap += $5; pss += $7;} END {print "swap = "swap/1024" PSS = "pss/1024}'

或为libvirt;

sudo smem | awk '/libvirt/{swap += $5; pss += $7;} END {print "swap = "swap/1024" PSS = "pss/1024}'

这将给你总MB像这样;

swap = 0 PSS = 2096.92

swap = 224.75 PSS = 421.455

在ubuntu 16.04到20.04上测试。