web-dev-qa-db-ja.com

Docker化されたアプリケーション内からDockerコンテナのCPUとメモリの使用量を取得する

Dockerコンテナ内からnode.jsアプリケーションを実行しています。 node.jsアプリケーションが実行されているコンテナーのシステム使用状況メトリックを取得しようとしています。現在、私は https://www.npmjs.com/package/dockerstats を使用していますが、CPUまたはメモリの使用量は常に表示されず、dockerstatsを実行するとそれぞれの使用量が表示されます。

私のコードは次のようになります。

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;
        });
    }
}
7
user5186815

あなたが言ったように、あなたはコンテナIDを取得するためにdocker-container-idパッケージを使用しています。このパッケージは、/proc/self/cgroupファイルを検査することで機能するため、コンテナー内からのみ機能する必要があります(つまり、コンテナー化されたプロセスからgetContainerId()が実行される場合のみ)。とは言うものの、さらに、アプリケーションが実行されているコンテナー内からメトリックを取得しようとしていると仮定します(この事実については明示的に言及していません)。

ここでの問題は、dockerstatsパッケージの説明に記載されているように、このパッケージはDocker APIを使用し、 パッケージソース に従って、クライアントが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 アクセスをホストシステムに与えることと本質的に同じです。

ただし、実際には、リソース消費メトリックにアクセスするためにDockerAPIを使用する必要はありません。重要なのは、プロセスのcpuacctおよびmemoryコントロールグループ(それぞれ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の統計を使用することもできます。詳細については、 このディスカッション を参照してください。

11
Danila Kiver

コメントするのに十分な評判がないので、 @ 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" }'

困っている人のために。

1