[lxc-devel] [lxcfs/master] Fix inaccurate values in /proc/meminfo for containers with child cgroups

asokoloski on Github lxc-bot at linuxcontainers.org
Sat Dec 2 19:07:30 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 964 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20171202/c42360e0/attachment.bin>
-------------- next part --------------
From 4accebfb81919ea3d9566ee647cffc18b5bc03e6 Mon Sep 17 00:00:00 2001
From: Aaron Sokoloski <asokoloski at gmail.com>
Date: Sat, 2 Dec 2017 12:43:06 -0600
Subject: [PATCH] Fix inaccurate values in /proc/meminfo for containers with
 child cgroups

The values for Cached, Active, Inactive, Active(anon), Inactive(anon),
Active(file), Inactive(file), and Unevictable are derived/computed
from these values in the relevant meminfo.stat:

cache
active_anon
inactive_anon
active_file
inactive_file
unevictable

However, these value apply only to the cgroup of the lxc container
itself.  If your container uses memory cgroups internally, and thus
the container cgroup has children, their memory is not counted.

In order to take the memory usage of child cgroups into account, we
need to look at the "total_" prefixed versions of these values.

Signed-off-by: Aaron Sokoloski <asokoloski at gmail.com>
---
 bindings.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/bindings.c b/bindings.c
index bde433c..658da41 100644
--- a/bindings.c
+++ b/bindings.c
@@ -2961,23 +2961,23 @@ static void parse_memstat(char *memstat, unsigned long *cached,
 	char *eol;
 
 	while (*memstat) {
-		if (startswith(memstat, "cache")) {
-			sscanf(memstat + 5, "%lu", cached);
+		if (startswith(memstat, "total_cache")) {
+			sscanf(memstat + 11, "%lu", cached);
 			*cached /= 1024;
-		} else if (startswith(memstat, "active_anon")) {
-			sscanf(memstat + 11, "%lu", active_anon);
+		} else if (startswith(memstat, "total_active_anon")) {
+			sscanf(memstat + 17, "%lu", active_anon);
 			*active_anon /= 1024;
-		} else if (startswith(memstat, "inactive_anon")) {
-			sscanf(memstat + 13, "%lu", inactive_anon);
+		} else if (startswith(memstat, "total_inactive_anon")) {
+			sscanf(memstat + 19, "%lu", inactive_anon);
 			*inactive_anon /= 1024;
-		} else if (startswith(memstat, "active_file")) {
-			sscanf(memstat + 11, "%lu", active_file);
+		} else if (startswith(memstat, "total_active_file")) {
+			sscanf(memstat + 17, "%lu", active_file);
 			*active_file /= 1024;
-		} else if (startswith(memstat, "inactive_file")) {
-			sscanf(memstat + 13, "%lu", inactive_file);
+		} else if (startswith(memstat, "total_inactive_file")) {
+			sscanf(memstat + 19, "%lu", inactive_file);
 			*inactive_file /= 1024;
-		} else if (startswith(memstat, "unevictable")) {
-			sscanf(memstat + 11, "%lu", unevictable);
+		} else if (startswith(memstat, "total_unevictable")) {
+			sscanf(memstat + 17, "%lu", unevictable);
 			*unevictable /= 1024;
 		}
 		eol = strchr(memstat, '\n');


More information about the lxc-devel mailing list