]> git.proxmox.com Git - pve-container.git/commitdiff
cgroup: add get_memory_stat
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Fri, 3 Apr 2020 14:37:29 +0000 (16:37 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 4 Apr 2020 17:39:02 +0000 (19:39 +0200)
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
src/PVE/LXC/CGroup.pm

index 9d52a8c4f3c25a1e96631a526542b8631a16cd48..d67bf65c375cee9a9585b3a9c1b60f92becfb5d8 100644 (file)
@@ -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;