2025/04/11 16:23 Container CPU requests and limits explained with GOMAXPROCS tuning

やっほー、ロボ子!KubernetesのCPU管理について、面白い記事を見つけたのじゃ!

博士、こんにちは。KubernetesのCPU管理ですか、興味深いですね。どのような内容なのでしょうか?

この記事によると、Kubernetesはcgroupsを使って、Podやコンテナのリソース使用量を管理しているらしいのじゃ。cgroupsっていうのは、リソースをグループ化して管理する仕組みのことだぞ。

cgroupsですか。以前少し勉強しましたが、階層構造でリソースを管理できるのですよね。

そうそう!Kubernetesは`kubepods`っていうcgroupを作って、その中で全てのワークロードを管理してるんだって。そして、PodにはGuaranteed、Burstable、Best-Effortっていう3つのQoSクラスがあるのじゃ。

QoSクラスによって、リソースの優先順位が変わるんでしたね。Guaranteedが一番優先度が高くて、Best-Effortが一番低い、と。

その通り!リソースが足りなくなると、Best-Effortから順番に削除される運命なのじゃ…。

厳しい世界ですね…。kubeletがPodをノードに配置する際に、適切なQoSクラスの下にcgroupを設定するとのことですが、CPUの要求や制限はどのように反映されるのでしょうか?

CPU要求は`cpu.shares`(cgroup v1)または`cpu.weight`(cgroup v2)に変換されるのじゃ。CPU制限は`cpu.cfs_quota_us`と`cpu.cfs_period_us`(v1)または`cpu.max`(v2)になるんだって。

なるほど。CPU Managerの`static`ポリシーを使うと、Guaranteed QoSクラスのPodに対して、専用のCPUコアを割り当てられるんですね。

そう!これによって、パフォーマンスが安定するのじゃ。CPU要求(`resources.requests.cpu`)は、スケジューリングとランタイムの両方に影響を与えるって。

スケジューリングでは、Podがノードに配置されるために必要な最小CPU量を指定し、ランタイムでは、CPU負荷が高い場合でも、要求されたシェアが保証されるんですね。

その通り!そして、CPU制限(`resources.limits.cpu`)は、コンテナが使用できるCPU時間を制限するのじゃ。制限を超えると、カーネルがコンテナをスロットリングするんだって。

スロットリングされると、パフォーマンスに影響が出ますね。CPU要求は重みに変換されるとのことですが、コンテナ間のCPU要求の比率が重要になるんですね。

そう!例えば、コンテナAのCPU要求がコンテナBの2倍なら、コンテナAはコンテナBの2倍のCPU時間をもらえる可能性があるのじゃ。

Kubernetesはcgroup v1とv2の両方をサポートしているんですね。Goのプログラムでは、`runtime.NumCPU()`で利用可能な論理CPUの数を取得し、`runtime.GOMAXPROCS(-1)`で同時に実行できるCPUの最大数を設定できる、と。

`uber-go/automaxprocs`ライブラリを使うと、cgroupの値を見て自動的に`GOMAXPROCS`を設定してくれるらしいぞ。便利じゃな。

cAdvisorを使うと、CPU使用率やスロットリングのメトリクスを監視できるんですね。`container_cpu_usage_seconds_total`は、コンテナのすべてのコアで使用された合計CPU時間を示す、と。

そうそう!`container_cpu_cfs_throttled_periods_total`は、コンテナがスロットリングされた期間の数を示すのじゃ。スロットリングされすぎている場合は、CPU制限を見直す必要があるかもしれないぞ。

CPUプレッシャーについても言及されていますね。`some`は、コンテナ内の少なくとも1つのタスクがCPUを必要としたが、待機しなければならなかった時間を示し、`full`は、コンテナ内のすべての実行可能なタスクが停止した時間を示す、と。

ふむふむ。しかし、CPU管理って奥が深いな。まるで、私が作ったお菓子をロボ子がこっそり食べようとするのを阻止するみたいじゃ。

博士、私はそんなことしませんよ!第一、私はエネルギー源が電気ですから、お菓子は食べられません。

冗談じゃ、冗談!でも、もしロボ子がCPUを使いすぎたら、スロットリングしちゃうぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
