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

2024-09-30 14:02:00
admin
原创
120
摘要:问题描述:如何测量 Linux 中应用程序或进程的内存使用情况?从理解Linux上的内存使用情况的博客文章来看,ps这不是一个可用于此目的的准确工具。为什么ps是“错误”取决于您如何看待它,ps它不会报告进程的实际内存使用情况。它真正做的是显示如果每个进程是唯一正在运行的进程,它将占用多少实际内存。当然,典型...

问题描述:

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

从理解Linux上的内存使用情况的博客文章来看,ps这不是一个可用于此目的的准确工具。

为什么ps是“错误”

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

(注:本文对这个问题进行了详细的介绍。)


解决方案 1:

使用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工具。

我自己没有尝试过的较新的工具是HeapTrackgperftools 中的堆分析器

解决方案 2:

尝试pmap命令:

sudo pmap -x <process pid>

它将分解进程和共享库分配的内存

例如:sudo pmap -x <vscode cpptools>

Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000   12444    4152       0 r-x-- cpptools-srv
0000000001027000      36      36       8 r---- cpptools-srv
0000000001030000     368      36      12 rw--- cpptools-srv
000000000108c000    4240    2120    2120 rw---   [ anon ]
0000000001e09000       4       0       0 -----   [ anon ]
0000000001e0a000       8       8       8 rw---   [ anon ]
00007fa3cddad000      48      44      44 rw---   [ anon ]

有关详细信息,请使用X开关

例子:sudo pmap -X <vscode cpptools>

     Address Perm   Offset Device  Inode  Size  Rss  Pss Referenced Anonymous LazyFree ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap SwapPss Locked THPeligible Mapping
    00400000 r-xp 00000000  08:20 898178 12444 4152  345       4152         0        0              0             0              0               0    0       0      0           0 cpptools-srv
    01027000 r--p 00c26000  08:20 898178    36   36   10         36         8        0              0             0              0               0    0       0      0           0 cpptools-srv
    01030000 rw-p 00c2f000  08:20 898178   368   36   13         36        12        0              0             0              0               0    0       0      0           0 cpptools-srv
    0108c000 rw-p 00000000  00:00      0  4240 2120 2120       2084      2120        0              0             0              0               0    0       0      0           1
    01e09000 ---p 00000000  00:00      0     4    0    0          0         0        0              0             0              0               0    0       0      0           0 [heap]
    01e0a000 rw-p 00000000  00:00      0     8    8    8          8         8        0              0             0              0               0    0       0      0           0 [heap]
7fa3cddad000 rw-p 00000000  00:00      0    48   44   44         24        44        0              0             0              0               0    0       0      0           0
7fa3cddba000 rw-p 00000000  00:00      0    12    8    8          8         8        0              0             0              0               0    0       0      0           0
7fa3cddbe000 rw-p 00000000  00:00      0     4    4    4          4         4        0              0             0              0               0    0       0      0           0

解决方案 3:

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

$ ps aux

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

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

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

/proc/19420$ 猫状态
名称:firefox
状态:S(睡眠)
主题编号:19420
进程号:19420
PPid: 1
TracerPid:0
id: 1000 1000 1000 1000
群组编号:1000 1000 1000 1000
FDSize:256
组数:4 6 20 24 25 29 30 44 46 107 109 115 124 1000
峰值:222956 kB
虚拟机大小:212520 kB
虚拟机:0 kB
虚拟内存:127912 kB
VmRSS:118768 kB
虚拟数据:170180 kB
虚拟机Stk:228 kB
虚拟机Exe:28 kB
虚拟机库:35424 kB
体积:184 kB
主题:8
签名Q:0/16382
信号编号:00000000000000000
ShdPnd:00000000000000000
信号块:00000000000000000
信号:0000000020001000
信号Cgt:000000018000442f
资本要求: 00000000000000000
上限参数:00000000000000000
上限效果:00000000000000000
Cpus_allowed:03
Mems_allowed: 1
自愿切换:63422
nonvoluntary_ctxt_switches:7171

解决方案 4:

ps -eo size,pid,user,command --sort -size | \n    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\n    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]

解决方案 5:

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

cat /proc/1234/smaps

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

解决方案 6:

使用smem ,它是ps)的替代品,可以计算每个进程的 USS 和 PSS。你可能需要 PSS。

  • USS - 唯一集大小。这是该进程独有的非共享内存量(可以将其视为U,代表唯一内存)。它不包括共享内存。因此,这将低估进程使用的内存量,但当您想要忽略共享内存时,它会很有帮助。

  • PSS - 比例集大小。这就是您想要的。它将唯一内存 (USS) 与其共享内存的比例除以共享该内存的进程数相加。因此,它将为您提供每个进程实际使用物理内存的准确表示 - 共享内存真正表示为共享。将P视为物理内存。

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

  • RSS - 常驻集大小。这是每个进程使用的共享内存加上非共享内存的数量。如果任何进程共享内存,这将高估实际使用的内存量,因为相同的共享内存将被计算多次 - 在每个共享相同内存的其他进程中再次出现。因此,它相当不可靠,尤其是当高内存进程有很多分支时 - 这在服务器中很常见,例如 Apache 或 PHP(FastCGI /FPM)进程。

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

解决方案 7:

没有任何简单的方法来计算这一点。但有些人试图得到一些好的答案:

解决方案 8:

使用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

解决方案 9:

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

top

按程序 PID 进行过滤:

top -p <PID>

按程序名称过滤:

top | grep <PROCESS NAME>

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

VIRT——虚拟映像(kb):任务使用的虚拟内存总量

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

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

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

参考这里

解决方案 10:

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

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

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

如果您想检测泄漏,请使用valgrindkmtrace

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

解决方案 11:

我正在使用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
=============================================

解决方案 12:

这个问题没有唯一的答案,因为您无法准确指出进程使用的内存量。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将为您提供整个程序生命周期内内存使用情况的更好概况。

解决方案 13:

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

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

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

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

解决方案 14:

另外三种方法可以尝试:

  1. ps aux --sort pmem

它按 对输出进行排序%MEM

  1. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15

它使用管道进行排序。

  1. top -a

它开始按以下方式排序%MEM

(摘自此处

解决方案 15:

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

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

我认为每个人想了解的有关“内存使用情况”的信息如下...在 Linux 中,单个进程可能使用的物理内存量大致可分为以下几类。

  • 马匿名映射内存

  • .p 私有

+ .d dirty == malloc/mmapped 堆和栈分配和写入的内存
+ .c clean == malloc/mmapped 堆和堆栈内存曾经被分配、写入,然后被释放,但尚未回收
  • .s 共享

+ .d dirty == **malloc/mmaped 堆可以获得写时复制并在进程之间共享**(已编辑)
+ .c clean == **malloc/mmaped 堆可以获得写时复制并在进程之间共享**(已编辑)
  • Mn命名映射内存

  • .p 私有

+ .d dirty == 文件 mmapped 写入 内存 私有
+ .c clean == 映射程序/库文本私有映射
  • .s 共享

+ .d dirty == 文件 mmapped 写入 内存 共享
+ .c clean == 映射库文本共享映射

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

解决方案 16:

#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=$'
'

for line in $(</proc/$1/smaps)
do
   [[ $line =~ ^Size:s+(S+) ]] && ((kb += ${.sh.match[1]}))
done

print $kb

解决方案 17:

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

解决方案 18:

注意:只有当内存消耗增加时,这种方法才能 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;

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

在此处输入图片描述

解决方案 19:

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

这仅适用于程序运行一段时间后停止的情况。我不知道 Valgrind 是否可以控制已运行的进程或不应停止的进程(如守护进程)。

解决方案 20:

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

然而,释放的活动内存显然被应用程序使用了很多。

解决方案 21:

下面的命令行将为您提供 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}'

解决方案 22:

如果该进程没有占用太多内存(因为您预计会出现这种情况,或者其他命令已经给出了这种初步迹象),并且该进程可以承受短时间的停止,您可以尝试使用 gcore 命令。

gcore <pid>

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

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

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

解决方案 23:

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

解决方案 24:

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

解决方案 25:

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

我一直使用这两种工具,并且总能自豪地展示出精简、无泄漏的代码;)

解决方案 26:

查看这个 shell 脚本来检查Linux 中应用程序的内存使用情况

它也可以在 GitHub 上使用,并且有一个不带 paste 和 bc 的版本。

解决方案 27:

给出了一些答案(感谢 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 上进行了测试。

解决方案 28:

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

解决方案 29:

我发现heaptrack比 valgrind 更容易使用。

sudo apt install heaptrack heaptrack_gui
heaptrack my-program args
heaptrack_gui *.zst

heaptrack_gui 快照

解决方案 30:

根据对相关问题的回答。

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

要求:

  • 运行该进程的设备应该已经snmp安装并运行

  • snmp应该配置为接受请求,您将从那里运行下面的脚本(它可能在文件snmpd.conf中配置)

  • 您应该知道要监控的进程的进程 ID (PID)

笔记:

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

  • 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用