[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