从 dockerized 应用程序中获取 CPU 和 docker 容器的内存使用情况
Getting CPU and Memory usage of a docker container from within the dockerized application
我是 运行 来自 docker 容器的 node.js 应用程序。我正在尝试检索 node.js 应用程序位于 运行 内的容器的系统使用指标。现在我正在使用 https://www.npmjs.com/package/dockerstats 但它始终显示没有 cpu 或内存使用情况,运行 docker 统计显示每个使用情况。
我的代码类似于以下内容:
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}`);
});
}
});
设置 class 类似于以下内容并使用 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 来访问资源消耗指标。关键是你可以直接从[=22]读取进程的cpuacct
和memory
控制组(分别负责跟踪和限制CPU和内存消耗)的信息=].例如,读取 /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。
由于我没有足够的声誉来发表评论,我想用一种快速的方法来补充 ,以检查 以兆字节为单位的内存使用情况:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte = /1024/1024; print byte " MB" }'
或千兆字节:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte = /1024/1024/1024; print byte " GB" }'
任何有需要的人。
我是 运行 来自 docker 容器的 node.js 应用程序。我正在尝试检索 node.js 应用程序位于 运行 内的容器的系统使用指标。现在我正在使用 https://www.npmjs.com/package/dockerstats 但它始终显示没有 cpu 或内存使用情况,运行 docker 统计显示每个使用情况。
我的代码类似于以下内容:
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}`);
});
}
});
设置 class 类似于以下内容并使用 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 来访问资源消耗指标。关键是你可以直接从[=22]读取进程的cpuacct
和memory
控制组(分别负责跟踪和限制CPU和内存消耗)的信息=].例如,读取 /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。
由于我没有足够的声誉来发表评论,我想用一种快速的方法来补充
cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte = /1024/1024; print byte " MB" }'
或千兆字节:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte = /1024/1024/1024; print byte " GB" }'
任何有需要的人。