web-dev-qa-db-ja.com

DockerコンテナーのCPU使用率をパーセンテージで取得する

Dockerは、インタラクティブな統計コマンドdocker stats [cid]次のように、CPU使用率に関する最新情報を提供します。

CONTAINER      CPU %          MEM USAGE/LIMIT       MEM %       NET I/O
36e8a65d       0.03%          4.086 MiB/7.798 GiB   0.05%       281.3 MiB/288.3 MiB

何らかの分析を行うために、CPU使用率を消化可能な形式でパーセンテージで取得しようとしています。

/ sys/fsで Docker Remote API と同様の値を提供する統計を確認しました。これにより、このJSON blobが得られます。

{
    "cpu_usage": {
        "usage_in_usermode": 345230000000, 
        "total_usage": 430576697133, 
        "percpu_usage": [
            112999686856, 
            106377031910, 
            113291361597, 
            97908616770
        ], 
        "usage_in_kernelmode": 80670000000
    }, 
    "system_cpu_usage": 440576670000000, 
    "throttling_data": {
        "throttled_time": 0, 
        "periods": 0, 
        "throttled_periods": 0
    }
}

しかし、その割合から正確なCPU使用率を取得する方法がわかりません。

何か案は?

22
Dan LaManna

Stats API呼び出しを使用する場合は、dockerクライアントがどのように実行するかを確認できます。 https://github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/ stats_helpers.go#L175-L188

func calculateCPUPercent(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 {
    var (
        cpuPercent = 0.0
        // calculate the change for the cpu usage of the container in between readings
        cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(previousCPU)
        // calculate the change for the entire system between readings
        systemDelta = float64(v.CPUStats.SystemUsage) - float64(previousSystem)
    )

    if systemDelta > 0.0 && cpuDelta > 0.0 {
        cpuPercent = (cpuDelta / systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100.0
    }
    return cpuPercent
}

基本的に、参照点を取得し、10秒程度の差を確認してから、コンテナーがどのくらいの時間を使用したかを確認できます。たとえば、コンテナのSystemCPUUsageとCPUUsageが0から始まります。 10秒後に10個のSystemCPUUsageと1個のCPUUsageがある場合、10%の使用率があります。 APIでは、秒単位ではなくナノ秒単位で結果が提供されます。実際の時間は重要ではなく、SystemCPUUsageの変更の合計が重要であり、CPUUSageをそれと比較します。

31
Michael

リモートAPIを使用した後、次のフィールドを取得します。precpu_stats/cpu_stats

次に、基本的にコードは次のとおりです:(javascriptの例)

var res <---- remote api response

var cpuDelta = res.cpu_stats.cpu_usage.total_usage -  res.precpu_stats.cpu_usage.total_usage;
var systemDelta = res.cpu_stats.system_cpu_usage - res.precpu_stats.system_cpu_usage;
var RESULT_CPU_USAGE = cpuDelta / systemDelta * 100;

RESULT_CPU_USAGE ...を明確にするために、物理ハードウェアから消費されるリソースの量であるため、RESULT_CPU_USAGEとして50%50%すべてのPCの電力がコンテナXによって使用されていることを意味します

7
Thiago Martins