这个问题是复盖 在这里, 很详细。

你如何测量存储器使用的应用程序或进程在Linux?

从博客的文章 了解存储器的使用在Linux上, ps 不是一个准确的工具的使用为此意向。

为什么 ps 是"错误"

这取决于你如何看待它, ps 没有报告真实存储器的使用的进程。什么是真正做的是表示有多少真实存储器中的每一过程将需要达 如果它们唯一的过程在运行.当然,一个典型的Linux机有几十个进程在任何给定时间运行,这意味着VSZ和RSS数字的报告 ps 几乎肯定 错误的.

有帮助吗?

解决方案

ps 或类似的工具你只会得到金额的存的网页分配通过这一进程。这个数字是正确的,但是:

  • 并不反映实际使用的内存量的应用程序,只有存量为它保留

  • 可能会产生误导,如果页面都是共享的,例如通过几个线或通过使用动态联系图书馆

如果你真的想知道什么内存量您的应用程序的实际使用,则需要运行它在分析器。例如, valgrind 可以给你的见解有关的量存储器的使用,并且,更重要的是,关于可能存泄在你的节目。堆分析器工具才是所谓的'山':

山是一堆分析器。它执行的详细堆分析,通过把定期的快照程序的堆。它产生一个表示堆使用过时的信息,包括关于其中部分程序是负责最存拨款。曲线图补充了通过案文或HTML文件,包括更多的信息,用于确定哪里最记忆是正在进行分配。地运行程序的大约20倍的速度比正常的。

作为解释的 才的文件, 你需要运行程序通过才:

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

山写入转储存使用的快照(例如 massif.out.12345).这些提供,(1)一个时间线上的存储器的使用,(2)每一张快照,记录在您的节目内存进行分配。一个伟大的图形的工具,用于分析这些文件是 山-可视化.但我发现 ms_print, ,一个简单的基于文本的工具的运用才能有很大的帮助。

找到记忆中的泄漏、使用的(默认) memcheck 工具的才.

其他提示

尝试 pmap 命令:

sudo pmap -x <process pid>

很难确定,但这里有两个“关闭”可以提供帮助的事情。

$ 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

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

cat /proc/1234/smaps

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

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

使用 smem, ,这是一种替代 ps 它计算号,PSS每一进程。你想要什么可能是PSS。

  • USS -独设置的尺寸。这是一数额的未共享内存的唯一过程(认为它作为 U 对于 唯一的 存储器)。它不包括共享内存。因此,这个会 -报告的量存储器的一个过程使用,但是有帮助的,当你想要忽略的共享内存。

  • PSS -比例设置的尺寸。这是你想要什么。它增加了在一起的独特的存储器(美国),随着一比例地共享内存的其他进程共享内存。因此,它会给你一个准确的表示多大的实际的物理存储器被使用的每个进程-与共享内存的真正代表作为共享。想想 P 正在为 物理 存储器。

怎么这个比较RSS的报告 ps 和其他的多数水利:

  • RSS -居民设置的尺寸。这是一的共享内存数量加上共享存储器中使用的每个过程。如果任何进程共享存储器,这将 -报告的内存数量实际使用的,因为同样的共享存储器将被计超过一次-再次出现在每一个其他进程共享相同的记忆。因此,它是 相当 不可靠,特别是当高记忆过程有很大的叉子-这是常见的,在服务器,用的东西喜欢Apache或PHP(fastcgi/FPM)的进程。

注意:smem还可以(可选)输出图表,如派的图表等。海事组织的你不需要任何那。如果你只是想利用它从命令行就像你可以使用ps-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 内置时间,而是中的那个时间,例如 / 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部分的详细信息。

如果你想检测到的泄漏、使用 或者可能 kmtrace.

如果你想要分析堆(malloc等)。 使用的应用程序,运行它 memprofkmtrace, ,轮廓的应用和搜索的功能呼叫树上最大的分配。看到他们的章节的更多详细信息。

除了您的答案中列出的解决方案,您可以使用Linux命令“top”;它提供了运行系统的动态实时视图,它为整个系统以及每个程序提供CPU和内存使用百分比:

top

按程序pid过滤:

top -p <PID>

按程序名称过滤:

top | grep <PROCESS NAME>

&QUOT;顶&QUOT;还提供了一些字段,例如:

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

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

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

SHR - 共享内存大小(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)

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

此外,如果您需要知道进程在进行容量规划时需要多少内存,则必须计算该进程的每个其他副本使用的内存量。我认为/ proc / PID / status可能会一次给你足够的内存使用信息。另一方面,valgrind将在程序的整个生命周期内为您提供更好的内存使用情况

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

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

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

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

可以展示的详细信息,但它 减慢 目标应明显,而大部分时间它改变行为的程序。
Exmap 是什么东西我不知道但是看来你需要一个 核心模块 获得的信息,这些信息可能是一个障碍。

我假设每个人都想知道考"存储器的使用"的下面...
在linux量的物理存储器的一个过程可能使用大致可以分为以下类别。

  • M.一个匿名映存储器

    • .p私
      • .d脏==malloc/mmapped堆栈分配和书面记忆
      • .c clean==malloc/mmapped堆堆的记忆一次分配,然后被释放,但还不回收
    • .共用
      • .d脏== malloc/mmaped堆可以得到复制编写和分享过程 (编辑)
      • .c clean== malloc/mmaped堆可以得到复制编写和分享过程 (编辑)
  • M.n名为映射的记忆

    • .p私
      • .d脏==文件mmapped写的私人记忆
      • .c clean==映射程/图书馆文私映射
    • .共用
      • .d脏==文件mmapped写共享存储器
      • .c clean==映射图书馆的文本的共享映射

实用工具包括在称为安卓 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

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

如果你有时间运行它,Valgrind会很棒。 valgrind --tool = massif 是正确的解决方案。

但是,我开始运行更大的示例,并且使用valgrind已不再实用。有没有办法告诉程序的最大内存使用量(模数页面大小和共享页面)?

在真正的unix系统上, / usr / bin / time -v 有效。但是,在Linux上,这不会 工作。

还有三种尝试方法:

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

    (摘自此处

#!/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 。然而,应用程序明显使用了很多活动内存。

如果进程没有消耗太多内存(或者因为你预计会出现这种情况,或者某些其他命令已经给出了这个初始指示),并且该进程可以承受短时间停止,那么你可以尝试使用gcore命令。

gcore <pid>

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

如果进程使用数百个megs或gigs,这将无法正常工作,因为核心生成可能需要几秒或几分钟才能创建,具体取决于I / O性能。在核心创建期间,停止(或“冻结”)过程以防止存储器改变。所以要小心。

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

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

我正在使用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。给它你的程序运行,它会告诉你很多关于它的内存使用情况。

这仅适用于运行一段时间并停止的程序。我不知道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 _ ,可以使用实际数量的非交换内存。

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

检查shell脚本以检查应用程序在linux中的内存使用情况。 也可以在 github 和版本没有粘贴和bc

此处的另一次投票,但我我想补充一点,您可以使用像 Alleyoop 这样的工具来帮助您解释valgrind生成的结果。

我一直使用这两种工具,并始终使用精简,无泄漏的代码来自豪地展示它;)

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

使用ubuntu中提供的内置“系统监视器”GUI工具

基于答案的一个相关的 的问题.

你可以使用SNMP获取存储器,并占用过程在特定装置在网络:)

要求:

  • 该设备运行的过程中应该有snmp安装和运行
  • snmp应配置,以接受的请求,从那里你会跑下脚本(可能配置在snmpd.conf)
  • 你应该知道的过程id(pid)的过程中,你要监视

注:

  • 主力资源信息库::hrSWRunPerfCPU 是的数量厘秒的总的系统的CPU所消耗的资源这一进程。请注意,在多处理系统,这种价值可以增加超过一厘-第二一厘二的实(墙上的钟)的时间。

  • 主力资源信息库::hrSWRunPerfMem 是的总金额的实际的系统存储器分配给这一进程。

**

过程监测脚本:

**

echo "IP: "
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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top