ECSタスクのDockerコンテナのCPU使用率については、監視自体に意味があるのか微妙なところもあるけれど、タスクの制限いっぱいまで常にCPUを使い切っているコンテナは不健康な場合もありそうだということで、Datadogで監視しようとしたことがあった。
docker.cpu.usageはホストの1コアに対するCPUの使用率なので、50%
となっていても、ECSのタスク定義でCPU=512
としていたら、リミットいっぱいいっぱいまで使っていることになるので、タスクやイメージによって閾値を変える必要が出てくる。そうなるとmulti alertが使えない。
docker.cpu.throttledというメトリクスがあって
これはnr_thresholdの値で、割り当てられたCPU時間の限界に達した数をカウントしてくれるのでこれを見ると良さそうだ…と思ったんだけれど、この値が変動するのは(たしか)--cpus
だったか--cpu-quota
だったかのオプションの時で、ECSのタスク定義でつかうcpu
=--cpu-shares
の時には変動しない。
どうしたものか、と思っていたところ /sys/fs/cgroup/cpu/cpu.shares
からcpu.sharesの値が取れたので、それで正規化すればいいじゃんということで、パッチを投げた。
めでたくマージされ、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%みたいなことになる
ということがあって、結果は微妙だった…
あんまりこの手の知見が見当たらなかったので、とりあえずメモとして残しておく。