Reading memory information under Linux systems
Introduction
Just a few notes about how to get informations how memory on linux, and common tools to read them.
Consultation
It’s possible to read about memory use under linux by multiple ways: /proc/meminfo, free, vmstat, top…
Those tools allow to get information about physical memory as virtual memory.
Firstly, we can get general infos reading /proc/meminfo or using free:
$ cat /proc/meminfo
MemTotal: 8058060 kB
MemFree: 757660 kB
Buffers: 401752 kB
Cached: 2958380 kB
SwapCached: 162336 kB
- MemTotal: Total usable ram (i.e. physical ram minus a few reserved bits and the kernel binary code)
- MemFree: Is sum of LowFree+HighFree (overall stat)
- Buffers: Memory in buffer cache
- Cached: Memory in the pagecache (diskcache) minus SwapCache (Doesn’t include SwapCached though)
- SwapCached: Memory that once was swapped out, is swapped back in but still also is in the swapfile
$ free -m
total used free shared buffers cached
Mem: 7869 7106 763 0 392 2893
-/+ buffers/cache: 3820 4048
Swap: 8073 601 7472
Then, we have to understand the top output:
top - 11:11:11 up 23 days, 17:37, 10 users, load average: 0.18, 0.16, 0.18
Tasks: 356 total, 1 running, 307 sleeping, 0 stopped, 48 zombie
%Cpu(s): 2.3 us, 1.4 sy, 0.0 ni, 96.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 16314188 total, 13358168 used, 2956020 free, 532416 buffers
KiB Swap: 16658428 total, 444 used, 16657984 free. 9372752 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18228 mycroft 20 0 1469652 398888 93480 S 5.0 2.4 81:13.74 chromium-browse
18183 mycroft 20 0 1426144 249424 94916 S 4.3 1.5 77:29.87 chromium-browse
2124 root 20 0 365924 90976 56240 S 2.6 0.6 488:25.19 Xorg
18437 mycroft 20 0 1336024 364608 37372 S 1.7 2.2 34:40.92 chromium-browse
- Virtual: Virtual memory allocated, including all code, data and shared libraries
- Resident: Non swapped physical memory
- Shared: Amount of memory available potentially shared with other proccesses
vmstat reports virtual memory statistics:
$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 615740 831376 401696 2970016 2 2 87 139 41 39 4 4 92 1
0 0 615740 833200 401696 2967316 0 0 0 15 853 1576 3 2 95 0
0 0 615740 832860 401696 2967932 0 0 0 83 704 1239 3 1 96 0
0 0 615740 837280 401696 2963756 0 0 0 92 864 1362 2 1 97 0
Les noyaux Linux récents fournissent un mécanisme pour que le noyau libère certains éléments stockés en mémoire à la demande, ce qui permet de libérer une partie de la mémoire. Pour cela, il faut utiliser le fichier /proc/sys/vm/drop_caches:
Recent linux kernels provide a mechanism to drop the page cache, inodes and dentry caches, which can free up a lot of memory, using virtual file /proc/sys/vm/drop_caches:
To free pagecache:
# echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
# echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
# echo 3 > /proc/sys/vm/drop_caches
These operations are non destructive and will only free non used things. Think to sync to flush I/O buffers before, and you may free more memory.
Finding out what processes are swapping
More recently, I needed to find out what processes had some memory stored in swap (which is way slower than RAM).
The swap information for each processes can also be found in /proc//status:
$ cat /proc/$$/status | grep VmSwap
VmSwap: 0 kB