DatadogでのECSタスクのCPUの監視について

ECSタスクのDockerコンテナのCPU使用率については、監視自体に意味があるのか微妙なところもあるけれど、タスクの制限いっぱいまで常にCPUを使い切っているコンテナは不健康な場合もありそうだということで、Datadogで監視しようとしたことがあった。

docker.cpu.usageはホストの1コアに対するCPUの使用率なので、50%となっていても、ECSのタスク定義でCPU=512としていたら、リミットいっぱいいっぱいまで使っていることになるので、タスクやイメージによって閾値を変える必要が出てくる。そうなるとmulti alertが使えない。

docker.cpu.throttledというメトリクスがあって

www.datadoghq.com

これはnr_thresholdの値で、割り当てられたCPU時間の限界に達した数をカウントしてくれるのでこれを見ると良さそうだ…と思ったんだけれど、この値が変動するのは(たしか)--cpusだったか--cpu-quotaだったかのオプションの時で、ECSのタスク定義でつかうcpu--cpu-sharesの時には変動しない。

どうしたものか、と思っていたところ /sys/fs/cgroup/cpu/cpu.shares からcpu.sharesの値が取れたので、それで正規化すればいいじゃんということで、パッチを投げた。

github.com

めでたくマージされ、v6も変更が入って、docker.cpu.sharesというメトリクスが入った。

これで、

avg:docker.cpu.usage{*} by {container_name} * 1024 / avg:docker.cpu.shares{*} by {container_name}

というモニタを作れば、100%に正規化された値を閾値として、multi alertが作れる…はずだったんだけれど

  • cpuが定義されていないと、使えない
  • たまに cpu.shares=3 みたいなタスクがあって、値が1000%みたいなことになる

ということがあって、結果は微妙だった…

あんまりこの手の知見が見当たらなかったので、とりあえずメモとして残しておく。