CPU使用率が増加するとパフォーマンスがどのように低下するかをGitHubのパフォーマンスエンジニアリングチームが解説

せっかく高性能なCPUを用意しても、何もしていないアイドル時間が長ければ無用の長物ですが、負荷をかけすぎると今度はパフォーマンスが落ちてしまうため、効率的ではありません。パフォーマンスを維持しつつシステム効率を最適化するために行った実験の成果を、GitHubが公開しました。
Breaking down CPU speed: How utilization impacts performance - The GitHub Blog
GitHubはまず、できる限り本番環境に近いワークロードからデータを収集しつつ、さまざまな負荷でシステムがどのように動作するかを把握できるという要件を満たすよう設計された「Large Unicorn Collider(LUC)」という環境を開発しました。
そして、専用マシンでホストされているLUC Kubernetesポッドに中程度の本番トラフィックを送信して基準となるベースラインを確立してから、ランダムな処理タスクを実行して特定の数のCPUコアを意図的に占有する「stress」というツールを使用して負荷をかけ、データを収集しました。
その結果、予想通りCPU使用率が上昇するにつれてすべてのインスタンスタイプでCPU時間が増加したことがわかりました。以下は、CPU使用率が上昇した際のリクエストあたりのCPU時間のグラフです。縦軸がp50(50パーセンタイル)、つまり中央値のCPU時間で、横軸はCPU使用率です。

また、以下はレイテンシの増加率に着目し、縦軸をp50のCPU時間のベースラインに対する増加率に変えたものです。

GitHubは興味深い点として、CPU使用率の増加に伴うCPUの周波数の変化を挙げています。これは、Intelのターボブーストテクノロジーによるもので、以下のグラフではCPU使用率が増加するにつれてCPU周波数が低下しているのがわかります。

十分に活用されていないノードはデータセンターのリソース、電力、スペースの無駄につながりますが、ノードの過度な使用も非効率的です。
GitHubによると、CPU使用率とCPU時間、つまりレイテンシの関係を最適化する上では次の2点を勘案するのがいいとのこと。
・CPU使用率がリソースの過小使用を回避できるほど十分な高さになっている。
・CPU時間の悪化が許容限度を超ていない。
上記の条件を満たす具体例が以下。CPU時間の悪化を40%未満に抑えることを目指しており、これは特定のインスタンスでのCPU使用率61%に相当します。

テスト結果を総括して、GitHubは「さまざまなCPUファミリーで、CPU使用率が増加するとパフォーマンスが低下することが確認されましたが、最適なCPU使用率のしきい値を特定することで、パフォーマンスと効率のバランスを改善し、インフラストラクチャがコスト効率とパフォーマンスの両方を維持できるようにすることができました。この洞察は、今後のリソースプロビジョニング戦略に役立ち、ハードウェア投資の効果を最大限に高めるのに貢献するでしょう」と述べました。
