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

use*_*815 5 usage-statistics node.js docker

我正在从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}`);
            });
        }
    });
Run Code Online (Sandbox Code Playgroud)

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;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 14

由于我没有足够的声誉来发表评论,我想用一种快速检查兆字节内存使用情况的方法来补充@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 是兆字节而不是兆字节。 (2认同)

Dan*_*ver 10

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

这里的问题是,如dockerstats软件包说明中所述,该软件包使用Docker API,并且根据软件包源,客户端连接到docker socket(/var/run/docker.sock),默认情况下该容器在容器内部不可用。一种简单(但很危险)的解决方法是/var/run/docker.sock在启动容器时通过使用以下选项将主机安装到容器中:

-v /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

例如

docker run -v /var/run/docker.sock:/var/run/docker.sock $MY_IMAGE_NAME
Run Code Online (Sandbox Code Playgroud)

但是,强烈建议不要这样做,因为它会造成严重的安全风险。绝对不要在生产中这样做。这样,您就可以让容器控制Docker,这与授予容器对主机系统的访问权限基本相同 。

但是实际上,您不需要使用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
Run Code Online (Sandbox Code Playgroud)

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

# cat /sys/fs/cgroup/cpuacct/cpuacct.usage
2166331144
Run Code Online (Sandbox Code Playgroud)

因此,您可以从应用程序中读取这些指标并进行处理。您也可以使用中的统计信息procfs,有关详细信息,请参阅此讨论