How to see top processes sorted by actual memory usage?

前端 未结 12 900
栀梦
栀梦 2020-12-07 06:53

I have a server with 12G of memory. A fragment of top is shown below:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                              


        
相关标签:
12条回答
  • 2020-12-07 07:22

    Building on gaoithe's answer, I attempted to make the memory units display in megabytes, and sorted by memory descending limited to 15 entries:

    ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n | tail -n 15 | sort -nr | awk '{ hr=$1/1024; printf("%13.2fM", hr); print "\t" $2 }'

           588.03M  /usr/sbin/apache2
           275.64M  /usr/sbin/mysqld
           138.23M  vim
            97.04M  -bash
            40.96M  ssh
            34.28M  tmux
            17.48M  /opt/digitalocean/bin/do-agent
            13.42M  /lib/systemd/systemd-journald
            10.68M  /lib/systemd/systemd
            10.62M  /usr/bin/redis-server
             8.75M  awk
             7.89M  sshd:
             4.63M  /usr/sbin/sshd
             4.56M  /lib/systemd/systemd-logind
             4.01M  /usr/sbin/rsyslogd
    

    Here's an example alias to use it in a bash config file:

        alias topmem="ps -e -orss=,args= |awk '{print \$1 \" \" \$2 }'| awk '{tot[\$2]+=\$1;count[\$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n | tail -n 15 | sort -nr | awk '{ hr=\$1/1024; printf(\"%13.2fM\", hr); print \"\t\" \$2 }'"
    

    Then you can just type topmem on the command line.

    0 讨论(0)
  • 2020-12-07 07:23

    First, repeat this mantra for a little while: "unused memory is wasted memory". The Linux kernel keeps around huge amounts of file metadata and files that were requested, until something that looks more important pushes that data out. It's why you can run:

    find /home -type f -name '*.mp3'
    find /home -type f -name '*.aac'
    

    and have the second find instance run at ridiculous speed.

    Linux only leaves a little bit of memory 'free' to handle spikes in memory usage without too much effort.

    Second, you want to find the processes that are eating all your memory; in top use the M command to sort by memory use. Feel free to ignore the VIRT column, that just tells you how much virtual memory has been allocated, not how much memory the process is using. RES reports how much memory is resident, or currently in ram (as opposed to swapped to disk or never actually allocated in the first place, despite being requested).

    But, since RES will count e.g. /lib/libc.so.6 memory once for nearly every process, it isn't exactly an awesome measure of how much memory a process is using. The SHR column reports how much memory is shared with other processes, but there is no guarantee that another process is actually sharing -- it could be sharable, just no one else wants to share.

    The smem tool is designed to help users better gage just how much memory should really be blamed on each individual process. It does some clever work to figure out what is really unique, what is shared, and proportionally tallies the shared memory to the processes sharing it. smem may help you understand where your memory is going better than top will, but top is an excellent first tool.

    0 讨论(0)
  • 2020-12-07 07:28
    ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10
    

    (Adding -n numeric flag to sort command.)

    0 讨论(0)
  • 2020-12-07 07:28

    You can see memory usage by executing this code in your terminal:

    $ watch -n2 free -m
    $ htop
    
    0 讨论(0)
  • 2020-12-07 07:29

    You have this simple command:

    $ free -h
    
    0 讨论(0)
  • 2020-12-07 07:31

    First you should read an explanation on the output of free. Bottom line: you have at least 10.7 GB of memory readily usable by processes.

    Then you should define what "memory usage" is for a process (it's not easy or unambiguous, trust me).

    Then we might be able to help more :-)

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