如何测量 Linux 中应用程序或进程的内存使用情况?
来自了解 Linux 上的内存使用的博客文章,ps
不是用于此意图的准确工具。
为什么
ps
是“错误的”根据您的看法,
ps
不报告进程的实际内存使用情况。它真正做的是显示如果每个进程是唯一运行的进程,它会占用多少实际内存。当然,一台典型的 Linux 机器在任何给定时间都有几十个进程在运行,这意味着所报告的 VSZ 和 RSS 数字ps
几乎肯定是错误的。
(注意:这个问题在这里有非常详细的介绍。)
如何测量 Linux 中应用程序或进程的内存使用情况?
来自了解 Linux 上的内存使用的博客文章,ps
不是用于此意图的准确工具。
为什么
ps
是“错误的”根据您的看法,
ps
不报告进程的实际内存使用情况。它真正做的是显示如果每个进程是唯一运行的进程,它会占用多少实际内存。当然,一台典型的 Linux 机器在任何给定时间都有几十个进程在运行,这意味着所报告的 VSZ 和 RSS 数字ps
几乎肯定是错误的。
(注意:这个问题在这里有非常详细的介绍。)
使用ps
或类似工具,您将只能获得该进程分配的内存页数量。这个数字是正确的,但是:
不反映应用程序实际使用的内存量,只反映为其保留的内存量
如果页面是共享的,例如通过多个线程或通过使用动态链接库,可能会产生误导
如果您真的想知道您的应用程序实际使用了多少内存,您需要在分析器中运行它。例如,Valgrind可以让您了解所使用的内存量,更重要的是,您可以了解程序中可能存在的内存泄漏。Valgrind 的堆分析器工具称为“massif”:
Massif 是一个堆分析器。它通过定期拍摄程序堆的快照来执行详细的堆分析。它会生成一个图表,显示随时间的堆使用情况,包括有关程序的哪些部分负责最多内存分配的信息。该图由文本或 HTML 文件补充,其中包含用于确定分配最多内存的位置的更多信息。Massif 运行程序的速度比正常速度慢 20 倍。
如Valgrind 文档中所述,您需要通过 Valgrind 运行程序:
valgrind --tool=massif <executable> <arguments>
Massif 写入内存使用快照的转储(例如massif.out.12345
)。这些提供,(1) 内存使用时间线,(2) 对于每个快照,记录程序内存中的分配位置。分析这些文件的一个很好的图形工具是massif-visualizer。但是我发现ms_print
Valgrind 附带的一个简单的基于文本的工具已经很有帮助了。
要查找内存泄漏,请使用 valgrind 的(默认)memcheck
工具。
试试pmap命令:
sudo pmap -x <process pid>
很难确定,但这里有两个“接近”的东西可以提供帮助。
$ ps aux
会给你虚拟大小(VSZ)
您还可以通过转至从/proc文件系统获取详细统计信息/proc/$pid/status
。
最重要的是 VmSize,它应该接近ps aux
给出的值。
/proc/19420$ 猫状态 名称:火狐 状态:S(睡眠) Tgid:19420 PID:19420 PID: 1 TracerPid: 0 用户ID:1000 1000 1000 1000 吉德:1000 1000 1000 1000 FDS大小:256 组:4 6 20 24 25 29 30 44 46 107 109 115 124 1000 VmPeak:222956 kB 虚拟机大小:212520 KB VmLck:0 kB VmHWM:127912 KB VmRSS:118768 KB 虚拟机数据:170180 kB VmStk:228 KB 虚拟机:28 kB 虚拟机库:35424 KB VmPTE:184 KB 主题:8 信号Q:0/16382 签名:0000000000000000 ShdPnd: 0000000000000000 信号块:0000000000000000 签名:0000000020001000 SigCgt: 000000018000442f CapInh: 0000000000000000 上限:0000000000000000 资本效率:0000000000000000 cpus_allowed: 03 Mems_allowed: 1 自愿_ctxt_switches:63422 非自愿_ctxt_switches:7171
在最新版本的 Linux 中,使用smaps子系统。例如,对于 PID 为 1234 的进程:
cat /proc/1234/smaps
它会准确地告诉你它当时使用了多少内存。更重要的是,它将内存划分为私有和共享,因此您可以知道您的程序实例正在使用多少内存,而不包括程序的多个实例之间共享的内存。
没有任何简单的方法可以计算这一点。但有些人试图得到一些好的答案:
使用smem,它是ps的替代方案,它计算每个进程的 USS 和 PSS。你可能想要PSS。
USS - 独特的套装尺寸。这是该进程独有的非共享内存量(将其视为唯一内存的U)。它不包括共享内存。因此,这将低于报告进程使用的内存量,但当您想忽略共享内存时它会很有帮助。
PSS - 比例集大小。这就是你想要的。它将唯一内存 (USS) 与其共享内存的一部分除以共享该内存的进程数相加。因此,它将为您提供每个进程正在使用多少实际物理内存的准确表示 - 共享内存真正表示为共享。想想P代表物理内存。
这与ps和其他实用程序报告的 RSS 相比如何:
注意:smem 还可以(可选)输出饼图等图形。海事组织你不需要任何这些。如果您只想像使用 一样从命令行使用它ps -A v
,那么您不需要安装 Python 和 Matplotlib 推荐的依赖项。
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 COMMAND
1288.57 Mb /usr/lib/firefox
821.68 Mb /usr/lib/chromium/chromium
762.82 Mb /usr/lib/chromium/chromium
588.36 Mb /usr/sbin/mysqld
547.55 Mb /usr/lib/chromium/chromium
523.92 Mb /usr/lib/tracker/tracker
476.59 Mb /usr/lib/chromium/chromium
446.41 Mb /usr/bin/gnome
421.62 Mb /usr/sbin/libvirtd
405.11 Mb /usr/lib/chromium/chromium
302.60 Mb /usr/lib/chromium/chromium
291.46 Mb /usr/lib/chromium/chromium
284.56 Mb /usr/lib/chromium/chromium
238.93 Mb /usr/lib/tracker/tracker
223.21 Mb /usr/lib/chromium/chromium
197.99 Mb /usr/lib/chromium/chromium
194.07 Mb conky
191.92 Mb /usr/lib/chromium/chromium
190.72 Mb /usr/bin/mongod
169.06 Mb /usr/lib/chromium/chromium
155.11 Mb /usr/bin/gnome
136.02 Mb /usr/lib/chromium/chromium
125.98 Mb /usr/lib/chromium/chromium
103.98 Mb /usr/lib/chromium/chromium
93.22 Mb /usr/lib/tracker/tracker
89.21 Mb /usr/lib/gnome
80.61 Mb /usr/bin/gnome
77.73 Mb /usr/lib/evolution/evolution
76.09 Mb /usr/lib/evolution/evolution
72.21 Mb /usr/lib/gnome
69.40 Mb /usr/lib/evolution/evolution
68.84 Mb nautilus
68.08 Mb zeitgeist
60.97 Mb /usr/lib/tracker/tracker
59.65 Mb /usr/lib/evolution/evolution
57.68 Mb apt
55.23 Mb /usr/lib/gnome
53.61 Mb /usr/lib/evolution/evolution
53.07 Mb /usr/lib/gnome
52.83 Mb /usr/lib/gnome
51.02 Mb /usr/lib/udisks2/udisksd
50.77 Mb /usr/lib/evolution/evolution
50.53 Mb /usr/lib/gnome
50.45 Mb /usr/lib/gvfs/gvfs
50.36 Mb /usr/lib/packagekit/packagekitd
50.14 Mb /usr/lib/gvfs/gvfs
48.95 Mb /usr/bin/Xwayland :1024
46.21 Mb /usr/bin/gnome
42.43 Mb /usr/bin/zeitgeist
42.29 Mb /usr/lib/gnome
41.97 Mb /usr/lib/gnome
41.64 Mb /usr/lib/gvfs/gvfsd
41.63 Mb /usr/lib/gvfs/gvfsd
41.55 Mb /usr/lib/gvfs/gvfsd
41.48 Mb /usr/lib/gvfs/gvfsd
39.87 Mb /usr/bin/python /usr/bin/chrome
37.45 Mb /usr/lib/xorg/Xorg vt2
36.62 Mb /usr/sbin/NetworkManager
35.63 Mb /usr/lib/caribou/caribou
34.79 Mb /usr/lib/tracker/tracker
33.88 Mb /usr/sbin/ModemManager
33.77 Mb /usr/lib/gnome
33.61 Mb /usr/lib/upower/upowerd
33.53 Mb /usr/sbin/gdm3
33.37 Mb /usr/lib/gvfs/gvfsd
33.36 Mb /usr/lib/gvfs/gvfs
33.23 Mb /usr/lib/gvfs/gvfs
33.15 Mb /usr/lib/at
33.15 Mb /usr/lib/at
30.03 Mb /usr/lib/colord/colord
29.62 Mb /usr/lib/apt/methods/https
28.06 Mb /usr/lib/zeitgeist/zeitgeist
27.29 Mb /usr/lib/policykit
25.55 Mb /usr/lib/gvfs/gvfs
25.55 Mb /usr/lib/gvfs/gvfs
25.23 Mb /usr/lib/accountsservice/accounts
25.18 Mb /usr/lib/gvfs/gvfsd
25.15 Mb /usr/lib/gvfs/gvfs
25.15 Mb /usr/lib/gvfs/gvfs
25.12 Mb /usr/lib/gvfs/gvfs
25.10 Mb /usr/lib/gnome
25.10 Mb /usr/lib/gnome
25.07 Mb /usr/lib/gvfs/gvfsd
24.99 Mb /usr/lib/gvfs/gvfs
23.26 Mb /usr/lib/chromium/chromium
22.09 Mb /usr/bin/pulseaudio
19.01 Mb /usr/bin/pulseaudio
18.62 Mb (sd
18.46 Mb (sd
18.30 Mb /sbin/init
18.17 Mb /usr/sbin/rsyslogd
17.50 Mb gdm
17.42 Mb gdm
17.09 Mb /usr/lib/dconf/dconf
17.09 Mb /usr/lib/at
17.06 Mb /usr/lib/gvfs/gvfsd
16.98 Mb /usr/lib/at
16.91 Mb /usr/lib/gdm3/gdm
16.86 Mb /usr/lib/gvfs/gvfsd
16.86 Mb /usr/lib/gdm3/gdm
16.85 Mb /usr/lib/dconf/dconf
16.85 Mb /usr/lib/dconf/dconf
16.73 Mb /usr/lib/rtkit/rtkit
16.69 Mb /lib/systemd/systemd
13.13 Mb /usr/lib/chromium/chromium
13.13 Mb /usr/lib/chromium/chromium
10.92 Mb anydesk
8.54 Mb /sbin/lvmetad
7.43 Mb /usr/sbin/apache2
6.82 Mb /usr/sbin/apache2
6.77 Mb /usr/sbin/apache2
6.73 Mb /usr/sbin/apache2
6.66 Mb /usr/sbin/apache2
6.64 Mb /usr/sbin/apache2
6.63 Mb /usr/sbin/apache2
6.62 Mb /usr/sbin/apache2
6.51 Mb /usr/sbin/apache2
6.25 Mb /usr/sbin/apache2
6.22 Mb /usr/sbin/apache2
3.92 Mb bash
3.14 Mb bash
2.97 Mb bash
2.95 Mb bash
2.93 Mb bash
2.91 Mb bash
2.86 Mb bash
2.86 Mb bash
2.86 Mb bash
2.84 Mb bash
2.84 Mb bash
2.45 Mb /lib/systemd/systemd
2.30 Mb (sd
2.28 Mb /usr/bin/dbus
1.84 Mb /usr/bin/dbus
1.46 Mb ps
1.21 Mb openvpn hackthebox.ovpn
1.16 Mb /sbin/dhclient
1.16 Mb /sbin/dhclient
1.09 Mb /lib/systemd/systemd
0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data
0.97 Mb /lib/systemd/systemd
0.96 Mb /lib/systemd/systemd
0.89 Mb /usr/sbin/smartd
0.77 Mb /usr/bin/dbus
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.74 Mb /usr/bin/dbus
0.71 Mb /usr/lib/apt/methods/http
0.68 Mb /bin/bash /usr/bin/mysqld_safe
0.68 Mb /sbin/wpa_supplicant
0.66 Mb /usr/bin/dbus
0.61 Mb /lib/systemd/systemd
0.54 Mb /usr/bin/dbus
0.46 Mb /usr/sbin/cron
0.45 Mb /usr/sbin/irqbalance
0.43 Mb logger
0.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/ssh
0.34 Mb /usr/lib/chromium/chrome
0.32 Mb cut
0.32 Mb cut
0.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 [lru
0.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/sda5
0.00 Mb [ext4
0.00 Mb [kworker/2:1H]
0.00 Mb [kauditd]
0.00 Mb [bioset]
0.00 Mb [drbd
0.00 Mb [irq/27
0.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 [iprt
0.00 Mb [iprt
0.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 [usb
0.00 Mb [bioset]
0.00 Mb [kworker/3:1]
0.00 Mb [kworker/u16:1]
使用time
.
不是Bash内置time
的,而是您可以找到的which time
,例如/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
这是工具和问题的一个很好的总结:archive.org 链接
我会引用它,以便更多的开发人员真正阅读它。
如果要分析整个系统的内存使用情况或彻底分析一个应用程序的内存使用情况(而不仅仅是其堆使用情况),请使用exmap。对于整个系统分析,找到具有最高有效使用率的进程,它们在实践中占用最多的内存,找到具有最高可写使用率的进程,它们创建的数据最多(因此可能泄漏或在数据使用方面非常无效)。选择这样的应用程序并在第二个列表视图中分析其映射。有关详细信息,请参阅 exmap 部分。还可以使用xrestop检查 X 资源的高使用率,尤其是在 X 服务器的进程占用大量内存的情况下。有关详细信息,请参阅 xrestop 部分。
如果您想检测泄漏,请使用valgrind或可能的 kmtrace。
如果您想分析应用程序的堆(malloc 等)使用情况,请在memprof或使用kmtrace运行它,分析应用程序并搜索函数调用树以获得最大分配。有关更多详细信息,请参阅他们的部分。
除了答案中列出的解决方案之外,您还可以使用 Linux 命令“top”。它提供了正在运行的系统的动态实时视图,并以百分比的形式提供了整个系统以及每个程序的 CPU 和内存使用情况:
top
按程序 PID 过滤:
top -p <PID>
按程序名称过滤:
top | grep <PROCESS NAME>
“top”还提供了一些字段,例如:
VIRT -- Virtual Image (kb):任务使用的虚拟内存总量
RES——驻留大小(kb):任务已使用的非交换物理内存;RES = 代码 + 数据。
DATA - 数据+堆栈大小 (kb):专用于可执行代码以外的物理内存量,也称为“数据驻留集”大小或 DRS。
SHR -- Shared Mem size (kb):任务使用的共享内存量。它只是反映可能与其他进程共享的内存。
参考这里。
对此没有单一的答案,因为您无法准确指出进程使用的内存量。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将在程序的整个生命周期内为您提供更好的内存使用情况。
如果您的代码使用 C 或 C++ 编写,您可能可以使用getrusage()
它返回有关进程的内存和时间使用情况的各种统计信息。
并非所有平台都支持这一点,并且将为内存使用选项返回 0 值。
相反,您可以查看在中创建的虚拟文件/proc/[pid]/statm
(其中[pid]
由您的进程 ID 替换。您可以从 中获取此文件getpid()
)。
这个文件看起来像一个包含 7 个整数的文本文件。您可能对此文件中的第一个(所有内存使用)和第六个(数据内存使用)数字最感兴趣。
我正在使用Arch Linux,有一个很棒的包叫做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
=============================================
Valgrind可以显示详细信息,但它会显着降低目标应用程序的速度,并且大多数情况下它会改变应用程序的行为。
Exmap是我还不知道的东西,但似乎您需要一个内核模块来获取信息,这可能是一个障碍。
关于“内存使用”,我假设每个人都想知道以下内容……在 Linux 中,单个进程可能使用的物理内存量大致可以分为以下几类。
马匿名映射内存
.p 私有
.s 共享
Mn 命名映射内存
.p 私有
.s 共享
Android中包含的名为showmap的实用程序非常有用
virtual shared shared private private
size 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.so
12 4 4 0 0 0 4 89529 /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
28 0 0 0 0 0 0 86661 /usr/lib/gconv/gconv-modules.cache
4 0 0 0 0 0 0 87660 /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
4 0 0 0 0 0 0 89528 /usr/lib/locale/en_US.utf8/LC_TELEPHONE
4 0 0 0 0 0 0 89527 /usr/lib/locale/en_US.utf8/LC_ADDRESS
4 0 0 0 0 0 0 87717 /usr/lib/locale/en_US.utf8/LC_NAME
4 0 0 0 0 0 0 87873 /usr/lib/locale/en_US.utf8/LC_PAPER
4 0 0 0 0 0 0 13879 /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
4 0 0 0 0 0 0 89526 /usr/lib/locale/en_US.utf8/LC_MONETARY
4 0 0 0 0 0 0 89525 /usr/lib/locale/en_US.utf8/LC_TIME
4 0 0 0 0 0 0 11378 /usr/lib/locale/en_US.utf8/LC_NUMERIC
1156 8 8 0 0 4 4 11372 /usr/lib/locale/en_US.utf8/LC_COLLATE
252 0 0 0 0 0 0 11321 /usr/lib/locale/en_US.utf8/LC_CTYPE
128 52 1 52 0 0 0 7909 /lib/ld-2.11.1.so
2316 32 11 24 0 0 8 7986 /lib/libncurses.so.5.7
2064 8 4 4 0 0 4 7947 /lib/libdl-2.11.1.so
3596 472 46 440 0 4 28 7933 /lib/libc-2.11.1.so
2084 4 0 4 0 0 0 7995 /lib/libnss_compat-2.11.1.so
2152 4 0 4 0 0 0 7993 /lib/libnsl-2.11.1.so
2092 0 0 0 0 0 0 8009 /lib/libnss_nis-2.11.1.so
2100 0 0 0 0 0 0 7999 /lib/libnss_files-2.11.1.so
3752 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
另外三种方法可以尝试:
ps aux --sort pmem
%MEM
。ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
top -a
%MEM
(摘自这里)
#!/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
更“真实世界”使用情况的一个很好的测试是打开应用程序,运行vmstat -s
并检查“活动内存”统计信息。关闭应用程序,等待几秒钟,然后vmstat -s
再次运行。
然而,应用程序显然正在使用释放的大量活动内存。
下面的命令行将为您提供在 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 性能创建核心生成可能需要几秒钟或几分钟。在核心创建过程中,进程会停止(或“冻结”)以防止内存更改。所以要小心。
还要确保生成核心的挂载点有足够的磁盘空间,并且系统不会对在该特定目录中创建的核心文件做出负面反应。
获取Valgrind。让它运行你的程序,它会告诉你很多关于它的内存使用情况。
这仅适用于程序运行一段时间并停止的情况。我不知道 Valgrind 是否可以处理已经运行的进程,或者不应该停止进程,例如守护进程。
注意:这只有在内存消耗增加时才能 100% 正常工作
如果您想监视给定进程(或一组已处理的共享通用名称,例如 )的内存使用情况google-chrome
,您可以使用我的 bash 脚本:
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 进行分析更快的东西并且您的内核较旧并且您不能使用 smaps,那么带有选项的 ps 可以显示进程的驻留集(带有ps -o rss,command
)可以让您快速合理_aproximation_
地了解实际数量正在使用非交换内存。
我建议你使用顶部。您可以在此页面上找到有关它的所有信息。它能够为您的流程提供所有必要的 KPI,还可以捕获到文件中。
查看此 shell 脚本以检查Linux 中应用程序的内存使用情况。
它也可以在 GitHub 上以及没有 paste 和 bc的版本中获得。
鉴于一些答案(感谢 thomasrutter),为了获得单个应用程序的实际交换和 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 上测试。
基于对相关问题的回答。
您可以使用SNMP来获取网络上特定设备中进程的内存和 CPU 使用情况:)
snmp
安装并运行snmp
应配置为接受来自您将运行以下脚本的请求(可以在文件snmpd.conf中配置)HOST-RESOURCES-MIB::hrSWRunPerfCPU是该进程消耗的系统总 CPU 资源的厘秒数。请注意,在多处理器系统上,该值可能会在 1 厘秒的实际(挂钟)时间内增加超过 1 厘秒。
HOST-RESOURCES-MIB::hrSWRunPerfMem是分配给该进程的实际系统内存总量。
echo "IP address: "
read ip
echo "Specfiy PID: "
read pid
echo "Interval in seconds: "
read interval
while [ 1 ]
do
date
snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
sleep $interval;
done
/prox/xxx/numa_maps 在那里提供了一些信息:N0=??? N1=???。但是这个结果可能会低于实际结果,因为它只计算那些被触摸过的。
最后但同样重要的是,使用htop。
sudo apt-get update
sudo apt-get install htop
使用以下命令运行 htop。
htop
使用 Ubuntu 中提供的内置系统监视器GUI 工具。