How can I measure the actual memory usage of an application or process?

后端 未结 30 2659
心在旅途
心在旅途 2020-11-22 03:01

This question is covered here in great detail.

How do you measure the memory usage of an application or process in Linux?

From the blog articl

相关标签:
30条回答
  • 2020-11-22 03:30

    Valgrind can show detailed information, but it slows down the target application significantly, and most of the time it changes the behavior of the application.

    Exmap was something I didn't know yet, but it seems that you need a kernel module to get the information, which can be an obstacle.

    I assume what everyone wants to know with respect to "memory usage" is the following... In Linux, the amount of physical memory a single process might use can be roughly divided into following categories.

    • M.a anonymous mapped memory

    • .p private

      • .d dirty == malloc/mmapped heap and stack allocated and written memory
      • .c clean == malloc/mmapped heap and stack memory once allocated, written, then freed, but not reclaimed yet
    • .s shared

      • .d dirty == malloc/mmaped heap could get copy-on-write and shared among processes (edited)
      • .c clean == malloc/mmaped heap could get copy-on-write and shared among processes (edited)
    • M.n named mapped memory

    • .p private

      • .d dirty == file mmapped written memory private
      • .c clean == mapped program/library text private mapped
    • .s shared

      • .d dirty == file mmapped written memory shared
      • .c clean == mapped library text shared mapped

    Utility included in Android called showmap is quite useful

    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
    
    0 讨论(0)
  • 2020-11-22 03:31

    Use time.

    Not the Bash builtin time, but the one you can find with which time, for example /usr/bin/time.

    Here's what it covers, on a simple 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
    
    0 讨论(0)
  • 2020-11-22 03:32

    There isn't a single answer for this because you can't pin point precisely the amount of memory a process uses. Most processes under Linux use shared libraries.

    For instance, let's say you want to calculate memory usage for the 'ls' process. Do you count only the memory used by the executable 'ls' (if you could isolate it)? How about libc? Or all these other libraries that are required to run '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)
    

    You could argue that they are shared by other processes, but 'ls' can't be run on the system without them being loaded.

    Also, if you need to know how much memory a process needs in order to do capacity planning, you have to calculate how much each additional copy of the process uses. I think /proc/PID/status might give you enough information of the memory usage at a single time. On the other hand, Valgrind will give you a better profile of the memory usage throughout the lifetime of the program.

    0 讨论(0)
  • 2020-11-22 03:34
    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
    

    Use this as root and you can get a clear output for memory usage by each process.

    OUTPUT EXAMPLE:

         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] 
    
    0 讨论(0)
  • 2020-11-22 03:34

    A good test of the more "real world" usage is to open the application, run vmstat -s, and check the "active memory" statistic. Close the application, wait a few seconds, and run vmstat -s again.

    However much active memory was freed was in evidently in use by the application.

    0 讨论(0)
  • 2020-11-22 03:34

    I would suggest that you use atop. You can find everything about it on this page. It is capable of providing all the necessary KPI for your processes and it can also capture to a file.

    0 讨论(0)
提交回复
热议问题