首页 文章

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

提问于
浏览
621

This question is covered here in great detail.

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

Understanding memory usage on Linux的博客文章中, ps 不是用于此意图的准确工具 .

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

30 回答

  • 3

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

  • 3

    这里有另一个对valgrind的投票,但我想补充一点,你可以使用像Alleyoop这样的工具来帮助你解释valgrind生成的结果 .

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

  • 1

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

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

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

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

  • 0

    Valgrind 可以显示详细信息,但它显着地显示了目标应用程序,并且大多数时候它会更改应用程序的行为 .
    Exmap 是我还不知道的东西,但似乎你需要一个 kernel module 来获取信息,这可能是一个障碍 .

    我假设每个人都想知道WRT "memory usage"如下......
    在linux中,单个进程可能使用的物理内存量大致可分为以下几类 .

    • M.a anonymous mapped memory

    • .p私有

    • .d dirty == malloc / mmapped堆和堆栈分配和写入的内存

    • .c clean == malloc / mmapped堆和堆栈内存一旦分配,写入,然后释放,但尚未回收

    • .s分享

    • .d dirty == malloc/mmaped heap could get copy-on-write and shared among processes (已编辑)

    • .c clean == malloc/mmaped heap could get copy-on-write and shared among processes (已编辑)

    • M.n named mapped memory

    • .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
    
  • 124
    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]
    
  • 4

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

    还有三种尝试方法:

    • ps aux --sort pmem
      它按 %MEM 对输出进行排序 .

    • ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
      它使用管道排序 .

    • top -a
      它由 %MEM 开始排序

    (摘自here

  • 0

    使用smem,这是ps的替代方案,可计算每个进程的USS和PSS . 你想要的可能是PSS .

    • USS - 独特的套装尺寸 . 这是该进程特有的非共享内存量(将其视为唯一内存的U) . 它不包括共享内存 . 因此,这将低估进程使用的内存量,但在您想要忽略共享内存时很有用 .

    • PSS - 比例集大小 . 这就是你想要的 . 它将唯一内存(USS)以及其共享内存的一部分除以共享该内存的其他进程的数量加在一起 . 因此,它将准确地表示每个进程使用多少实际物理内存 - 共享内存真正表示为共享 . 想想P是物理记忆 .

    如何与 ps 和其他实用程序报告的RSS进行比较:

    • RSS - 驻地集大小 . 这是每个进程使用的共享内存量和非共享内存量 . 如果任何进程共享内存,这将过度报告实际使用的内存量,因为相同的共享内存将被多次计数 - 在共享相同内存的每个其他进程中再次出现 . 因此它是相当不可靠的,特别是当高内存进程有很多分支时 - 这在服务器中很常见,有Apache或PHP(fastcgi / FPM)进程 .

    注意:smem还可以(可选)输出饼图等图形 . IMO你不需要任何这些 . 如果您只想在命令行中使用它,就像使用ps -A v一样,那么您不需要安装python-matplotlib推荐的依赖项 .

  • 9

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

    top
    

    通过程序pid过滤:

    top -p <PID>
    

    按程序名称过滤:

    top | grep <PROCESS NAME>
    

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

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

    RES - 驻留大小(kb):任务使用的非交换物理内存; RES =代码数据 .

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

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

    参考here .

  • 25

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

    cat /proc/1234/smaps
    

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

  • 120

    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
    
  • 2
    #!/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
    
  • 239

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

    虽然这个问题似乎是关于检查当前正在运行的进程,但我希望看到应用程序从头到尾使用的峰值内存 . 除了valgrind,你可以使用tstime,这更简单 . 它测量"highwater"内存使用情况(RSS和虚拟) . 来自this answer .

  • 17

    试试pmap命令:

    sudo pmap -x <process pid>
    
  • 315

    很难说清楚,但这里有两个“关闭”的东西可以提供帮助 .

    $ 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
    
  • 59

    检查shell脚本以检查memory usage by application in linux . 也可在github和版本without paste and bc中找到 .

  • 12

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

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

    如果页面是共享的,

    • 可能会产生误导,例如通过多个线程或使用动态链接库

    如果您真的想知道应用程序实际使用的内存量,则需要在分析器中运行它 . 例如, valgrind 可以为您提供有关内存使用量的见解,更重要的是,可以为您提供有关程序中可能的内存泄漏的信息 . valgrind的堆分析器工具名为'massif':

    Massif是一个堆分析器 . 它通过获取程序堆的常规快照来执行详细的堆分析 . 它生成一个显示堆使用情况的图表,包括有关程序的哪些部分负责大多数内存分配的信息 . 该图由文本或HTML文件补充,该文件包含用于确定分配最多内存的位置的更多信息 . Massif运行程序比正常情况慢20倍 .

    valgrind documentation中所述,您需要通过valgrind运行程序:

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

    Massif写了一个内存使用快照转储(例如 massif.out.12345 ) . 它们提供(1)内存使用的时间线,(2)每个快照,记录程序内存的分配位置 . 用于分析这些文件的一个很棒的图形工具是massif-visualizer . 但我发现 ms_print ,一个随valgrind一起提供的简单的基于文本的工具,已经有了很大的帮助 .

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

  • 55

    如果你想要比使用Valgrind进行分析更快的东西并且你的内核更老并且你不能使用smaps,那么带有显示进程驻留集的选项的ps(使用 ps -o rss,command )可以为你提供一个快速而合理的 _aproximation_ 真实正在使用的未交换内存量 .

  • 9

    基于对相关question的回答 .

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

    Requirements:

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

    • snmp应配置为接受下面运行脚本的请求(可能在snmpd.conf中配置)

    • 您应该知道要监视的进程的进程ID(pid)

    Notes:

    • HOST-RESOURCES-MIB::hrSWRunPerfCPU 是此进程占用的系统总CPU资源的厘秒数 . 请注意,在多处理器系统上,此值可能在实际(挂钟)时间的1厘米内增加超过1厘秒 .

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

    **

    Process monitoring script:

    **

    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
    
  • 9

    如果进程没有耗尽太多内存(或者是因为你希望是这种情况,或者其他命令已经给出了这个初始指示),那么进程可以承受在短时间内停止,您可以尝试使用gcore命令 .

    gcore <pid>
    

    检查生成的核心文件的大小,以便了解特定进程使用的内存量 .

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

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

  • 4

    编辑: this works 100% well only when memory consumption increases

    如果要监视给定进程(或已处理的共享公用名组,例如 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;
    

    这将不断寻找变化并打印出来 .

    enter image description here

  • 183

    对更多"real world"用法的一个很好的测试是打开应用程序,然后运行 vmstat -s 并检查"active memory"统计信息 . 关闭应用程序,等待几秒钟再次运行 vmstat -s . 然而,应用程序明显使用了很多活动内存 .

  • 6

    没有简单的方法可以计算出来 . 但有些人试图得到一些好的答案:

  • 5

    使用ubuntu中提供的内置“ system monitor ”GUI工具

  • 3

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

  • 14

    这是对工具和问题的出色总结:archive.org link

    我会引用它,以便更多开发者真正阅读它 .

    如果要分析整个系统的内存使用情况或彻底分析一个应用程序的内存使用情况(而不仅仅是其堆使用情况),请使用exmap . 对于整个系统分析,找到具有最高有效使用率的进程,它们在实践中占用最多内存,查找具有最高可写用量的进程,它们创建大多数数据(因此可能泄漏或在其数据使用中非常无效) . 选择此类应用程序并在第二个列表视图中分析其映射 . 有关详细信息,请参阅exmap部分 . 还可以使用xrestop检查X资源的高使用率,尤其是在X服务器的进程占用大量内存的情况下 . 有关详细信息,请参阅xrestop部分 . 如果要检测泄漏,请使用valgrind或可能的kmtrace . 如果要分析应用程序的堆(malloc等)用法,请在memprof或kmtrace中运行它,对应用程序进行概要分析并搜索函数调用树以获取最大分配 . 有关详细信息,请参阅其章节 .

  • 92

    如果你有时间运行它,Valgrind是惊人的 . valgrind --tool=massif 是正确的解决方案 .

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

    在真正的unix系统上, /usr/bin/time -v 有效 . 但是,在Linux上,这不起作用 .

  • 1

    得到valgrind . 给它你的程序运行,它会告诉你很多关于它的内存使用情况 .

    这仅适用于运行一段时间并停止的程序 . 我不知道valgrind是否可以在已经运行的进程中获取或者不应该停止诸如守护进程之类的进程 .

  • 8

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

相关问题