昨日、cgroups メモリ コントローラで興味深い状況に遭遇しました。cgroups によって報告されるメモリは、プロセスの総メモリ消費量であると常に考えていましたが、そうではないようです。
テスト用に次の Java プログラミングを作成しました。
import java.util.Scanner;
class TestApp {
public static void main(String args[]) {
int[] arr;
Scanner in = new Scanner(System.in);
System.out.println("Press enter to allocate memory");
in.nextLine();
arr = new int[1024*1024];
System.out.println("Allocated memory");
while(true);
}
}
上記を で実行すると、メモリ使用量は、JVM の PID をcgroup のファイルに ing するcgexec場合とは大きく異なります。プロセスが cgroup 内に配置された後、cgroup がそのプロセスのメモリ使用量を報告しているようです。echocgroup.procs
cgroup はメモリをどのように考慮しますか? cgexecを使用すると、JVMの消費が考慮されるようです。一方、cgroup の外部で JVM を起動し、後で PID をファイルに書き込んで cgroup に移動すると、Enter キーを押して消費量が期待どおりになるまで、cgroup.procs報告されたメモリ消費量はゼロのままです。memory.usage_in_bytes1024 * 1024 * 4
さらに、 によって報告されるメモリ消費量は、たとえばcgroupsによって報告されるメモリ消費量と完全に同じではありません。top
編集:次のCプログラムを作成し、テストに使用しました。私は同じ結果を見ています。を使用している場合cgclassify、Enter キーを押すまでメモリ使用率は 0 のままです。一方、 を使用する場合cgexec、Enter を押す前のメモリ使用率は > 0 です。
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Press ENTER to consume memory\n");
getchar();
char *ptr = malloc(1024*1024);
if (ptr == NULL) {
printf("Out of memory");
exit(1);
}
memset(ptr, 0, 1024*1024);
printf("Press ENTER to quit\n");
getchar();
return(0);
}