Free
Free Linux command is one of those tools you will be definitely get exposed to as a sysadmin, and understanding its output is extremely important. A bad interpretation of free output could cause unnecessary panic and you don't want to panic for no reason :D (oh wait... maybe you do, I certainly don't ).
Lets have a look at a simple free output:
juan@test:~$ free total used free shared buffers cached Mem: 3007572 584872 2422700 14780 55808 291704 -/+ buffers/cache: 237360 2770212 Swap: 0 0 0 juan@test:~$
In the line starting with "Mem:" we get to see the total available physical memory on the system 3007572 KBytes (3GBytes) and then how it is distributed:
- used: memory being occupied
- free: memory that is available in the system
- shared: amount of memory that is shared between processes
- buffers: memory used for kernel buffers involving IO (disk, network, etc)
- cached: memory used for data caching
- There are 237360 KBytes being used, this number is the result of the following math "used - (buffers + cached)". This is the amount of memory the system is actually relying on.
- There are 2770212 KBytes that could be utilized, this is the result of "free + buffers + cached". What this number actually means is that the kernel should be able to reclaim buffer and cached memory if necessary.
The power of the force source
Free binary is shipped as part of procps-ng package in Linux and we can inspect its latest code here. What free actually does for you is summarize memory utilization details coming from /proc/meminfo in a more "human way". So lets dissect this...
- The main source code can be read here free.c, if you have a look at the lines between 359-377, you can see that there are 6 variables kb_main_total, kb_main_used, kb_main_free, kb_main_shared, kb_main_buffers and kb_main_cached and they are actually the ones containing the values that will show up in free's output. However if you look for these variables on the code you won't find them, they are extern variables included from "proc/sysinfo.h" which means the variables are being initialized somewhere else, particularly in "proc/sysinfo.c". The variables are actually being populated by meminfo() function being called in line 355.
meminfo(); /* Translation Hint: You can use 9 character words in * the header, and the words need to be right align to * beginning of a number. */ if (flags & FREE_WIDE) { printf(_(" total used free shared buffers cache available")); } else { printf(_(" total used free shared buff/cache available")); } printf("\n"); printf("%-7s", _("Mem:")); printf(" %11s", scale_size(kb_main_total, flags, args)); printf(" %11s", scale_size(kb_main_used, flags, args)); printf(" %11s", scale_size(kb_main_free, flags, args)); printf(" %11s", scale_size(kb_main_shared, flags, args)); if (flags & FREE_WIDE) { printf(" %11s", scale_size(kb_main_buffers, flags, args)); printf(" %11s", scale_size(kb_main_cached, flags, args)); } else { printf(" %11s", scale_size(kb_main_buffers+kb_main_cached, flags, args)); } printf(" %11s", scale_size(kb_main_available, flags, args)); printf("\n");
- Now checking the "proc/sysinfo.c" code where meminfo() function exists, we see:
- kb_main_buffer is populated with the content of Buffers value from /proc/meminfo (line 691), this is memory used by the kernel to temporarily hold data being sent/received by the system (network IO, disk IO, etc).
- kb_main_cached is populated with the result of "kb_page_cache + kb_slab_reclaimable" (line 762). These two values come from Cached and SReclaimable respectively (in /proc/meminfo). So the cached value presented by free contains the memory used by the page cache and the reclaimable slab memory (slab memory caches dentry and inodes structures to speed up some fs operations).
{"Bounce", &kb_bounce}, {"Buffers", &kb_main_buffers}, // important {"Cached", &kb_page_cache}, // important {"CommitLimit", &kb_commit_limit}, ... kb_main_cached = kb_page_cache + kb_slab_reclaimable; kb_swap_used = kb_swap_total - kb_swap_free;
It is clear now that free relies completely on the details exposed by the kernel through /proc/meminfo, and the math involved in getting the values isn't really rocket science after all. But here it comes the interesting part...
To have in mind
It looks like the information provided by free can be slightly different between different Linux flavors (because they carry different free versions :D) so I thought it might be worth pointing that out here as well. This could lead to some inconsistencies when some other tools rely on the output of free.
Free version shipped with Ubuntu 14.04 (3.3.9), doesn't even include Slabs under the cached memory, you can see here how kb_main_cached value is just populated with Cached value from /proc/meminfo.
juan@test:~$ free -V free from procps-ng 3.3.9 juan@test:~$ free total used free shared buffers cached Mem: 3007572 530948 2476624 14776 53080 244740 -/+ buffers/cache: 233128 2774444 Swap: 0 0 0 juan@test:~$ grep "^Cached\|^SReclaimable\|^Slab" /proc/meminfo Cached: 244740 kB Slab: 32308 kB SReclaimable: 17572 kB juan@test:~$
Note: cached = Cached
Free version shipped with CentOS 7 (3.3.10), defines kb_main_cached as "kb_page_cache + kb_slab" (706) this seems a minor thing but not all the slab memory is reclaimable therefore part of this cached content is not really available in case of memory pressure.
[juan@server ~]$ free -V free from procps-ng 3.3.10 [juan@server ~]$ free -w total used free shared buffers cache available Mem: 1016860 74212 818380 6688 948 123320 810600 Swap: 0 0 0 [juan@server ~]$ grep "^Cached\|^SRecl\|^Slab" /proc/meminfo Cached: 88876 kB Slab: 34444 kB SReclaimable: 13928 kB [juan@server ~]$
Note: cache = Cached + Slab
Interesting, isn't it? That's the power of open source after all right? Having the chance to really understand what certain piece of software is doing for you and how is doing it!
That's all about free, hope it helps (it helped me at least :P).
No hay comentarios:
Publicar un comentario