【问题标题】:Getting CPU and Memory usage of a docker container from within the dockerized application从 dockerized 应用程序中获取 docker 容器的 CPU 和内存使用情况
【发布时间】:2018-07-09 14:39:34
【问题描述】:

我正在 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 容器(通常)在您的控制下运行单个进程,并且“容器”没有太多其他功能,因此在容器内的 /proc/self/proc/1 中四处寻找可能以相对较少的特权为您提供所需的信息。
  • @DavidMaze 那么 docker 容器的文件系统中有 /proc/self 或 /proc/1 吗?对于我正在研究的解决方案,我将挂载 /proc/stat 和在容器的 cgroup 中找到的 cpuacct.usage 并从中读取。

标签: node.js docker usage-statistics


【解决方案1】:

正如您所说,您正在使用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 来访问资源消耗指标。关键是你可以直接从/sys/fs/cgroup中读取进程的cpuacctmemory控制组(分别负责跟踪和限制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

【讨论】:

    【解决方案2】:

    由于我没有足够的声誉来发表评论,我想用一种快速的方法来补充answer from @danila-kiver,以检查以兆字节为单位的内存使用情况

    cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte =$1 /1024/1024; print byte " MB" }'

    或以千兆字节为单位:

    cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte =$1 /1024/1024/1024; print byte " GB" }'

    给有需要的人。

    【讨论】:

    • /1024 将是 Mebibytes 而不是 Mb。
    猜你喜欢
    • 2012-04-03
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多