Posted By: Anonymous
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 12979 frank 20 0 206m 21m 12m S 11 0.2 26667:24 krfb 13 root 15 -5 0 0 0 S 1 0.0 36:25.04 ksoftirqd/3 59 root 15 -5 0 0 0 S 0 0.0 4:53.00 ata/2 2155 root 20 0 662m 37m 8364 S 0 0.3 338:10.25 Xorg 4560 frank 20 0 8672 1300 852 R 0 0.0 0:00.03 top 12981 frank 20 0 987m 27m 15m S 0 0.2 45:10.82 amarok 24908 frank 20 0 16648 708 548 S 0 0.0 2:08.84 wrapper 1 root 20 0 8072 608 572 S 0 0.0 0:47.36 init 2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd
free -m shows the following:
total used free shared buffers cached Mem: 12038 11676 362 0 599 9745 -/+ buffers/cache: 1331 10706 Swap: 2204 257 1946
If I understand correctly, the system has only 362 MB of available memory. My question is: How can I find out which process is consuming most of the memory?
Just as background info, the system is running
64bit OpenSuse 12.
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).
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.
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.