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

后端 未结 30 2716
心在旅途
心在旅途 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:50

    If you want something quicker than profiling with Valgrind and your kernel is older and you can't use smaps, a ps with the options to show the resident set of the process (with ps -o rss,command) can give you a quick and reasonable _aproximation_ of the real amount of non-swapped memory being used.

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

    It is hard to tell for sure, but here are two "close" things that can help.

    $ ps aux
    

    will give you Virtual Size (VSZ)

    You can also get detailed statistics from the /proc file-system by going to /proc/$pid/status.

    The most important is the VmSize, which should be close to what ps aux gives.

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

    Note: this works 100% well only when memory consumption increases

    If you want to monitor memory usage by given process (or group of processed sharing common name, e.g. google-chrome, you can use my bash-script:

    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;
    

    this will continuously look for changes and print them.

    Enter image description here

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

    I am using Arch Linux and there's this wonderful package called ps_mem:

    ps_mem -p <pid>
    

    Example Output

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

    This is an excellent summary of the tools and problems: archive.org link

    I'll quote it, so that more devs will actually read it.

    If you want to analyse memory usage of the whole system or to thoroughly analyse memory usage of one application (not just its heap usage), use exmap. For whole system analysis, find processes with the highest effective usage, they take the most memory in practice, find processes with the highest writable usage, they create the most data (and therefore possibly leak or are very ineffective in their data usage). Select such application and analyse its mappings in the second listview. See exmap section for more details. Also use xrestop to check high usage of X resources, especially if the process of the X server takes a lot of memory. See xrestop section for details.

    If you want to detect leaks, use valgrind or possibly kmtrace.

    If you want to analyse heap (malloc etc.) usage of an application, either run it in memprof or with kmtrace, profile the application and search the function call tree for biggest allocations. See their sections for more details.

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

    In recent versions of Linux, use the smaps subsystem. For example, for a process with a PID of 1234:

    cat /proc/1234/smaps
    

    It will tell you exactly how much memory it is using at that time. More importantly, it will divide the memory into private and shared, so you can tell how much memory your instance of the program is using, without including memory shared between multiple instances of the program.

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