Jaromir Capik f3eed83
From 3569c0351fae7797e8d62feae7229d2d6d2aa0a1 Mon Sep 17 00:00:00 2001
Jaromir Capik f3eed83
From: Jakob Unterwurzacher <jakobunt@gmail.com>
Jaromir Capik f3eed83
Date: Tue, 18 Feb 2014 22:12:21 +0100
Jaromir Capik f3eed83
Subject: [PATCH] library: properly handle memory used by tmpfs
Jaromir Capik f3eed83
Jaromir Capik f3eed83
tmpfs has become much more widely used since distributions use it for
Jaromir Capik f3eed83
/tmp (Fedora 18+). In /proc/meminfo, memory used by tmpfs is accounted
Jaromir Capik f3eed83
into "Cached" (aka "NR_FILE_PAGES",
Jaromir Capik f3eed83
 http://lxr.free-electrons.com/source/mm/shmem.c#L301 ).
Jaromir Capik f3eed83
Jaromir Capik f3eed83
The tools just pass it on, so what top, free and vmstat report as
Jaromir Capik f3eed83
"cached" is the sum of page cache and tmpfs.
Jaromir Capik f3eed83
Jaromir Capik f3eed83
free has the extremely useful "-/+ buffers/cache" output. However, now
Jaromir Capik f3eed83
that tmpfs is accounted into "cached", those numbers are way off once
Jaromir Capik f3eed83
you have big files in /tmp.
Jaromir Capik f3eed83
Jaromir Capik f3eed83
Fortunately, kernel 2.6.32 introduces "Shmem", which makes tmpfs memory
Jaromir Capik f3eed83
usage accessible from userspace (
Jaromir Capik f3eed83
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4b02108ac1b3354a22b0d83c684797692efdc395 ).
Jaromir Capik f3eed83
Jaromir Capik f3eed83
This patch substracts Shmem from Cached to get the actual page cache
Jaromir Capik f3eed83
memory. This makes both issues mentioned above disappear. For older
Jaromir Capik f3eed83
kernels, Shmem is not available (hence zero) and this patch is no-op.
Jaromir Capik f3eed83
Jaromir Capik f3eed83
Additionally:
Jaromir Capik f3eed83
* Update the man pages of free and vmstat to explain what is happening
Jaromir Capik f3eed83
* Finally drop "MemShared" from the /proc/meminfo parser, it has been
Jaromir Capik f3eed83
  dead for 10+ years and is only causing confusion ( removed in kernel
Jaromir Capik f3eed83
  2.5.54, see
Jaromir Capik f3eed83
  https://git.kernel.org/cgit/linux/kernel/git/tglx/history.git/commit/?id=fe04e9451e5a159247cf9f03c615a4273ac0c571 )
Jaromir Capik f3eed83
---
Jaromir Capik f3eed83
 free.1         | 29 ++++++++++++++++++++++++-----
Jaromir Capik f3eed83
 proc/sysinfo.c |  8 ++++----
Jaromir Capik f3eed83
 proc/sysinfo.h |  3 +--
Jaromir Capik f3eed83
 vmstat.8       |  3 ++-
Jaromir Capik f3eed83
 4 files changed, 31 insertions(+), 12 deletions(-)
Jaromir Capik f3eed83
Jaromir Capik f3eed83
diff --git a/free.1 b/free.1
Jaromir Capik f3eed83
index 1e8e7ef..21cce28 100644
Jaromir Capik f3eed83
--- a/free.1
Jaromir Capik f3eed83
+++ b/free.1
Jaromir Capik f3eed83
@@ -11,11 +11,30 @@ free \- Display amount of free and used memory in the system
Jaromir Capik f3eed83
 .SH DESCRIPTION
Jaromir Capik f3eed83
 .B free
Jaromir Capik f3eed83
 displays the total amount of free and used physical and swap memory in the
Jaromir Capik f3eed83
-system, as well as the buffers used by the kernel.
Jaromir Capik f3eed83
-The shared memory column represents either the MemShared value (2.4 series
Jaromir Capik f3eed83
-kernels) or the Shmem value (2.6 series kernels and later) taken from the
Jaromir Capik f3eed83
-/proc/meminfo file. The value is zero if none of the entries is exported
Jaromir Capik f3eed83
-by the kernel.
Jaromir Capik f3eed83
+system, as well as the buffers and caches used by the kernel. The
Jaromir Capik f3eed83
+information is gathered by parsing /proc/meminfo. The displayed
Jaromir Capik f3eed83
+columns are:
Jaromir Capik f3eed83
+.TP
Jaromir Capik f3eed83
+\fBtotal\fR
Jaromir Capik f3eed83
+Total installed memory (MemTotal and SwapTotal in /proc/meminfo)
Jaromir Capik f3eed83
+.TP
Jaromir Capik f3eed83
+\fBused\fR
Jaromir Capik f3eed83
+Used memory (calculated as total - free)
Jaromir Capik f3eed83
+.TP
Jaromir Capik f3eed83
+\fBfree\fR
Jaromir Capik f3eed83
+Unused memory (MemFree and SwapFree in /proc/meminfo)
Jaromir Capik f3eed83
+.TP
Jaromir Capik f3eed83
+\fBshared\fR
Jaromir Capik f3eed83
+Memory used (mostly) by tmpfs (Shmem in /proc/meminfo, available on
Jaromir Capik f3eed83
+kernels 2.6.32, displayed as zero if not available)
Jaromir Capik f3eed83
+.TP
Jaromir Capik f3eed83
+\fBbuffers\fR
Jaromir Capik f3eed83
+Memory used by kernel buffers (Buffers in /proc/meminfo)
Jaromir Capik f3eed83
+.TP
Jaromir Capik f3eed83
+\fBcached\fR
Jaromir Capik f3eed83
+Memory used by the page cache  (calculated as Cached - Shmem in
Jaromir Capik f3eed83
+/proc/meminfo - the Cached value is actually the sum of page cache and
Jaromir Capik f3eed83
+tmpfs memory)
Jaromir Capik f3eed83
 .SH OPTIONS
Jaromir Capik f3eed83
 .TP
Jaromir Capik f3eed83
 \fB\-b\fR, \fB\-\-bytes\fR
Jaromir Capik f3eed83
diff --git a/proc/sysinfo.c b/proc/sysinfo.c
Jaromir Capik f3eed83
index 1680cc4..e07ca86 100644
Jaromir Capik f3eed83
--- a/proc/sysinfo.c
Jaromir Capik f3eed83
+++ b/proc/sysinfo.c
Jaromir Capik f3eed83
@@ -531,7 +531,6 @@ static int compare_mem_table_structs(const void *a, const void *b){
Jaromir Capik f3eed83
  *
Jaromir Capik f3eed83
  * MemTotal:        61768 kB    old
Jaromir Capik f3eed83
  * MemFree:          1436 kB    old
Jaromir Capik f3eed83
- * MemShared:           0 kB    old (now always zero; not calculated)
Jaromir Capik f3eed83
  * Buffers:          1312 kB    old
Jaromir Capik f3eed83
  * Cached:          20932 kB    old
Jaromir Capik f3eed83
  * Active:          12464 kB    new
Jaromir Capik f3eed83
@@ -560,7 +559,7 @@ static int compare_mem_table_structs(const void *a, const void *b){
Jaromir Capik f3eed83
  * Hugepagesize:     4096 kB    2.5.??+
Jaromir Capik f3eed83
  */
Jaromir Capik f3eed83
 
Jaromir Capik f3eed83
-/* obsolete since 2.6.x, but reused for shmem in 2.6.32+ */
Jaromir Capik f3eed83
+/* Shmem in 2.6.32+ */
Jaromir Capik f3eed83
 unsigned long kb_main_shared;
Jaromir Capik f3eed83
 /* old but still kicking -- the important stuff */
Jaromir Capik f3eed83
 unsigned long kb_main_buffers;
Jaromir Capik f3eed83
@@ -631,14 +630,13 @@ void meminfo(void){
Jaromir Capik f3eed83
   {"LowTotal",     &kb_low_total},
Jaromir Capik f3eed83
   {"Mapped",       &kb_mapped},       // kB version of vmstat nr_mapped
Jaromir Capik f3eed83
   {"MemFree",      &kb_main_free},    // important
Jaromir Capik f3eed83
-  {"MemShared",    &kb_main_shared},  // obsolete since kernel 2.6! (sharing the variable with Shmem replacement)
Jaromir Capik f3eed83
   {"MemTotal",     &kb_main_total},   // important
Jaromir Capik f3eed83
   {"NFS_Unstable", &kb_nfs_unstable},
Jaromir Capik f3eed83
   {"PageTables",   &kb_pagetables},   // kB version of vmstat nr_page_table_pages
Jaromir Capik f3eed83
   {"ReverseMaps",  &nr_reversemaps},  // same as vmstat nr_page_table_pages
Jaromir Capik f3eed83
   {"SReclaimable", &kb_swap_reclaimable}, // "swap reclaimable" (dentry and inode structures)
Jaromir Capik f3eed83
   {"SUnreclaim",   &kb_swap_unreclaimable},
Jaromir Capik f3eed83
-  {"Shmem",        &kb_main_shared},  // kernel 2.6 and later (sharing the output variable with obsolete MemShared)
Jaromir Capik f3eed83
+  {"Shmem",        &kb_main_shared},  // kernel 2.6.32 and later
Jaromir Capik f3eed83
   {"Slab",         &kb_slab},         // kB version of vmstat nr_slab
Jaromir Capik f3eed83
   {"SwapCached",   &kb_swap_cached},
Jaromir Capik f3eed83
   {"SwapFree",     &kb_swap_free},    // important
Jaromir Capik f3eed83
@@ -684,6 +682,8 @@ nextline:
Jaromir Capik f3eed83
   }
Jaromir Capik f3eed83
   kb_swap_used = kb_swap_total - kb_swap_free;
Jaromir Capik f3eed83
   kb_main_used = kb_main_total - kb_main_free;
Jaromir Capik f3eed83
+  /* "Cached" includes "Shmem" - we want only the page cache here */
Jaromir Capik f3eed83
+  kb_main_cached -= kb_main_shared;
Jaromir Capik f3eed83
 }
Jaromir Capik f3eed83
 
Jaromir Capik f3eed83
 /*****************************************************************/
Jaromir Capik f3eed83
diff --git a/proc/sysinfo.h b/proc/sysinfo.h
Jaromir Capik f3eed83
index 1eb3472..2291631 100644
Jaromir Capik f3eed83
--- a/proc/sysinfo.h
Jaromir Capik f3eed83
+++ b/proc/sysinfo.h
Jaromir Capik f3eed83
@@ -20,8 +20,7 @@ extern int        uptime (double *uptime_secs, double *idle_secs);
Jaromir Capik f3eed83
 extern unsigned long getbtime(void);
Jaromir Capik f3eed83
 extern void       loadavg(double *av1, double *av5, double *av15);
Jaromir Capik f3eed83
 
Jaromir Capik f3eed83
-
Jaromir Capik f3eed83
-/* obsolete */
Jaromir Capik f3eed83
+/* Shmem in 2.6.32+ */
Jaromir Capik f3eed83
 extern unsigned long kb_main_shared;
Jaromir Capik f3eed83
 /* old but still kicking -- the important stuff */
Jaromir Capik f3eed83
 extern unsigned long kb_main_buffers;
Jaromir Capik f3eed83
diff --git a/vmstat.8 b/vmstat.8
Jaromir Capik f3eed83
index 420d9f3..2782a42 100644
Jaromir Capik f3eed83
--- a/vmstat.8
Jaromir Capik f3eed83
+++ b/vmstat.8
Jaromir Capik f3eed83
@@ -102,7 +102,8 @@ b: The number of processes in uninterruptible sleep.
Jaromir Capik f3eed83
 swpd: the amount of virtual memory used.
Jaromir Capik f3eed83
 free: the amount of idle memory.
Jaromir Capik f3eed83
 buff: the amount of memory used as buffers.
Jaromir Capik f3eed83
-cache: the amount of memory used as cache.
Jaromir Capik f3eed83
+cache: the amount of memory used as cache (excluding tmpfs memory for
Jaromir Capik f3eed83
+kernels 2.6.32+)
Jaromir Capik f3eed83
 inact: the amount of inactive memory.  (\-a option)
Jaromir Capik f3eed83
 active: the amount of active memory.  (\-a option)
Jaromir Capik f3eed83
 .fi
Jaromir Capik f3eed83
-- 
Jaromir Capik f3eed83
1.8.4.2
Jaromir Capik f3eed83