コントロールグループ (cgroups) は、システム上のリソースの割り当て、管理、および監視に使用できるLinuxカーネル機能です。 cgroupの階層または数がシステムに適していない場合、アプリケーションのパフォーマンスが低下する可能性があります。 このトピックでは、cgroupsによって引き起こされるアプリケーションのパフォーマンスジッタの問題と、それが発生しないようにする方法について説明します。
問題の説明
コンテナ関連のビジネスシナリオでは、システム上のアプリケーションでリクエストの遅延が増加することがあり、コンテナがデプロイされているホストのCPU使用率では、sysメトリック
(カーネルが占有するCPUの割合) が30% 以上に達します。 たとえば、topコマンドを実行してLinuxパフォーマンスデータを表示すると、次のコマンド出力のsy値で示されるように、sysメトリックが30% に達します。
トップ-16:21:19アップ22日、1:59、3ユーザー、負荷平均: 40.02、30.02、25.06
タスク: 合計193、3実行、190睡眠、0停止、0ゾンビ
% Cpu(s): 20.0 us、30.0 sy、0.0 ni、45.0 id、5.0 wa、0.0 hi、0.0 si、0.0 st
KiB Mem: 合計24130808、2071424フリー、1832512使用、20226872バフ /キャッシュ
KiBスワップ: 合計0、フリー0、使用0。 19737776 avail Mem
考えられる原因
cat /proc/cgroupsコマンドを実行してすべてのcgroupの状態を表示すると、次のコマンド出力に示すように、メモリに対応するcgroupの数が2040と高いことがわかります。
# subsys_name階層num_cgroups enabled
cpuset 2 200 1
cpu 2 200 1
cpuacct 2 200 1
blkio 6 62 1
メモリ10 2040 1
デバイス5 59 1
この場合、perfを使用して問題の原因を分析および特定できます。
ソリューション
LinuxインスタンスでO&Mを実行する場合、次のソリューションを使用して、cgroupによって引き起こされるアプリケーションのパフォーマンスジッタを防ぐことができます。
- 各cgroup内に10個以下の子cgroupを作成します。
- システムに1,000個以下のcgroupsを作成し、その数を可能な限り最小限に抑えます。