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 - 3.3.9-6 +- Subtracting Shmem from Cached (#1070736) + * Wed Feb 05 2014 Jaromir Capik - 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 +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 +