- Subtracting Shmem from Cached (#1070736)

This commit is contained in:
Jaromir Capik 2014-02-27 14:59:44 +01:00
parent 61adcde98d
commit f3eed83b00
2 changed files with 161 additions and 1 deletions

View File

@ -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@redhat.com> - 3.3.9-6
- Subtracting Shmem from Cached (#1070736)
* Wed Feb 05 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-5
- Support for timestamps & wide diskstat (#1053428, #1025833)
- Fixing fd leak in watch

View File

@ -0,0 +1,155 @@
From 3569c0351fae7797e8d62feae7229d2d6d2aa0a1 Mon Sep 17 00:00:00 2001
From: Jakob Unterwurzacher <jakobunt@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