gpt4 book ai didi

node.js - 从 dockerized 应用程序中获取 docker 容器的 CPU 和内存使用情况

转载 作者:搜寻专家 更新时间:2023-11-01 00:16:13 26 4
gpt4 key购买 nike

我正在 docker 容器中运行 node.js 应用程序。我正在尝试检索运行 node.js 应用程序的容器的系统使用指标。现在我正在使用 https://www.npmjs.com/package/dockerstats但它始终显示没有 cpu 或内存使用情况,运行 docker stats 显示每个的使用情况。

我的代码类似于以下内容:

let dockerId = setUp.getDockerId();
dockerId.then(dockerId => {
if (dockerId !== null) {
console.log(`dockerId: ${dockerId}`);
dockerstats.dockerContainerStats(dockerId, data => {
console.log(`cpu_percent: ${data.cpu_percent}`);
console.log(`memPercent: ${data.memPercent}`);
console.log(`memUsage: ${data.memUsage}`);
});
}
});

setUp 类类似于以下内容并使用 https://www.npmjs.com/package/docker-container-id :

const getId = require('docker-container-id');
module.exports = class setUp {

getDockerId () {
return getId().then(id => {
if (!id) {
return null;
}
return id;
});
}
}

最佳答案

如您所说,您正在使用 docker-container-id 包来获取容器 ID。这个包通过检查 /proc/self/cgroup 文件来工作,因此它应该只在容器内部工作(即只有当 getContainerId() 从容器化进程中执行时).也就是说,我进一步假设您正在尝试从您的应用程序运行的容器内部获取指标(您没有明确提到这个事实)。

这里的问题是,如 dockerstats 包描述中所述,此包使用 Docker API,并且根据 package source ,客户端连接到docker套接字(/var/run/docker.sock),默认情况下容器内部不可用。解决此问题的简单(但危险)方法是在启动容器时使用以下选项将主机的 /var/run/docker.sock 挂载到容器中:

-v /var/run/docker.sock:/var/run/docker.sock

例如

docker run -v /var/run/docker.sock:/var/run/docker.sock $MY_IMAGE_NAME

但是,强烈反对,因为它会带来严重的安全风险。切勿在生产中这样做。通过这样做,您允许您的容器控制 Docker,这在本质上与授予容器 root 访问主机系统相同。

但实际上您不需要使用 Docker API 来访问资源消耗指标。关键是你可以直接从cpuacctmemory控制组(分别负责跟踪和限制CPU和内存消耗)的信息中读取/sys/fs/cgroup。例如,读取 /sys/fs/cgroup/memory/memory.usage_in_bytes 文件将为您提供容器使用的内存量(以字节为单位):

# cat /sys/fs/cgroup/memory/memory.usage_in_bytes 
164823040

阅读 /sys/fs/cgroup/cpuacct/cpuacct.usage 文件将为您提供容器的总 CPU 使用率(以纳秒为单位):

# cat /sys/fs/cgroup/cpuacct/cpuacct.usage
2166331144

因此,您可以从应用程序中读取这些指标并对其进行处理。您也可以使用来自 procfs 的统计信息,请参阅 this discussion了解详情。

关于node.js - 从 dockerized 应用程序中获取 docker 容器的 CPU 和内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51248144/

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