gpt4 book ai didi

java - 使用 cgexec vs cgroup.procs 使用 cgroups 进行内存核算

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:02 25 4
gpt4 key购买 nike

昨天我在 cgroups 内存 Controller 上遇到了一个有趣的情况。我一直认为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);
}

}

当使用 cgexec 运行上面的代码时,内存使用量与 echo将 JVM 的 PID 放入 cgroup.procs 时有很大不同> cgroup 的文件。似乎 cgroups 报告进程的内存使用情况它被放置在 cgroup 中。

cgroup是怎么占内存的?似乎在使用 cgexec 时,会考虑 JVM 消耗。另一方面,当在 cgroup 外部启动 JVM 并稍后通过将 PID 写入 cgroup.procs 文件将其移入其中时,memory.usage_in_bytes< 中报告的内存消耗 保持为零,直到我按回车键并且消耗按预期上升到 1024 * 1024 * 4

此外,cgroups 报告的内存消耗与 top 报告的内存消耗并不完全相同,例如。

编辑:创建了以下 C 程序并将其用于测试。我看到了相同的结果。如果使用 cgclassify,内存利用率将保持为 0,直到按下回车键。另一方面,当使用 cgexec 时,在按回车之前内存利用率 > 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);
}

最佳答案

当你分配一个页面并且它被一个进程调入时,分配的内存被标记一个标识符,告诉内核这个内存属于哪个特定的内存 Controller cgroup(显然内存也属于c组)。

当您将一个进程迁移到一个新的 cgroup 时,分配的内存已经不会改变它的标签。 “重新标记”所有内容会非常昂贵,甚至没有意义(假设一个页面由两个进程共享,而您只将一个迁移到不同的 cgroup。"new"标记需要是什么?它现在被不同 cgroup 中的两个进程使用...)

因此,如果您位于/sys/fs/cgroup/memory cgroup(即,您的任务组 ID 在/sys/fs/cgroup/memory/tasks 中提及,而不是在任何子组的任务文件中cgroup),您分配的任何内容都将根据那个 cgroup 计算,并且只计算那个 cgroup。

当您迁移到不同的 cgroup(或子 cgroup)时,只有内存分配被标记为属于该新 cgroup。

cgexec 将在一个 cgroup 中启动 JVM,因此在初始化时分配的任何内容都已经属于专门为您执行的内容创建的 cgroup。

如果您在内存 Controller 的根 cgroup 中启动 JVM,那么在初始化 JVM 时分配和接触的任何内容都将属于根 cgroup。

一旦您将 JVM 迁移到它自己的私有(private) cgroup(使用任一机制)并且然后您分配并访问了一些页面,那么显然这些页面将属于新的 cgroup。

关于java - 使用 cgexec vs cgroup.procs 使用 cgroups 进行内存核算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33759054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com