Go、コンテナ、そして Linux スケジューラ
(riverphillips.dev)- コンテナ内の Go アプリケーション: Go 開発者は、ホスト資源の独占を防ぐために CPU 制限が必要なコンテナへアプリケーションをデプロイすることがよくあります。
- Go ランタイムと CPU 制限: Go ランタイムはコンテナの CPU 制限を本質的に認識しないため、過剰使用や性能問題を引き起こす可能性があります。
- Go ガベージコレクタ (GC): Go の GC は並行して実行されますが、スイープ終了時およびマーク終了時には、データ整合性のために短い「世界停止」の一時停止が必要です。
- Linux スケジューラ - CFS: Linux の完全公正スケジューラ (CFS) は CPU 時間を比例配分し、プロセスは許可されたコア数に応じた CPU 時間を受け取ります。
- Go と CFS の問題点: Go は CPU コアごとに 1 本の OS スレッドを生成しますが、コンテナの CPU 制限を無視するため、GC の「世界停止」時間が長くなる可能性があります。
GOMAXPROCSの設定:GOMAXPROCS環境変数を使って Go の OS スレッド数をコンテナの CPU 制限に合わせることで、GC のレイテンシを減らせます。GOMAXPROCSの自動化: Uber のautomaxprocsライブラリは、コンテナ制限に基づいてGOMAXPROCSを自動設定し、構成を簡素化できます。- 将来の Go ランタイム改善: Go ランタイムに CPU 制限の自動認識を統合するための GitHub イシューが公開されています。
結論: コンテナ内の Go アプリケーションで効率的な資源利用と性能維持を実現するには、CPU 制限と GOMAXPROCS を適切に構成することが重要です。
1件のコメント
Hacker Newsの意見
--cpu-sharesの使用推奨GOMEMLIMIT導入と、メモリ制限を自動設定するツールautomemlimitへの言及koツールのメンテナーによるプロジェクトへの言及に対する感謝