[pve-devel] [PATCH container 09/20] cgroup: add get_memory_stat

w.bumiller at proxmox.com w.bumiller at proxmox.com
Fri Apr 3 16:37:29 CEST 2020


From: Wolfgang Bumiller <w.bumiller at proxmox.com>

Signed-off-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
 src/PVE/LXC/CGroup.pm | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/PVE/LXC/CGroup.pm b/src/PVE/LXC/CGroup.pm
index 9d52a8c..d67bf65 100644
--- a/src/PVE/LXC/CGroup.pm
+++ b/src/PVE/LXC/CGroup.pm
@@ -255,4 +255,46 @@ sub get_cpu_stat {
     return $res;
 }
 
+# Parse some memory data from `memory.stat`
+sub get_memory_stat {
+    my ($self) = @_;
+
+    my $res = {
+	mem => 0,
+	swap => 0,
+    };
+
+    if (cgroup_mode() == 2) {
+	if (defined(my $path = $self->get_path('memory'))) {
+	    my $mem = file_get_contents("$path/memory.current");
+	    my $swap = file_get_contents("$path/memory.swap.current");
+
+	    chomp ($mem, $swap);
+
+	    # FIXME: For the cgv1 equivalent of `total_cache` we may need to sum up
+	    # the values in `memory.stat`...
+
+	    $res->{mem} = $mem;
+	    $res->{swap} = $swap;
+	} else {
+	    # memory controller not enabled or container not running
+	    return undef;
+	}
+    } elsif (defined(my $path = $self->get_path('memory'))) {
+	# cgroupv1 environment:
+	my $stat = parse_flat_keyed_file(file_get_contents("$path/memory.stat"));
+	my $mem = file_get_contents("$path/memory.usage_in_bytes");
+	my $memsw = file_get_contents("$path/memory.memsw.usage_in_bytes");
+	chomp ($mem, $memsw);
+
+	$res->{mem} = $mem - $stat->{total_cache};
+	$res->{swap} = $memsw - $mem;
+    } else {
+	# container most likely isn't running
+	return undef;
+    }
+
+    return $res;
+}
+
 1;
-- 
2.20.1





More information about the pve-devel mailing list