[procps-ng] - Subtracting Shmem from Cached (#1070736)

Jaromír Cápík jcapik at fedoraproject.org
Thu Feb 27 13:58:59 UTC 2014


commit f3eed83b00aead2fc20b31a8f37d14bad4d76c06
Author: Jaromir Capik <jcapik at redhat.com>
Date:   Thu Feb 27 14:59:44 2014 +0100

    - Subtracting Shmem from Cached (#1070736)

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


More information about the scm-commits mailing list