コントロールグループ (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を使用して問題の原因を分析および特定できます。

  1. 次のコマンドを実行してperfをインストールします。
    yumインストールperf -y
  2. 次のコマンドを実行して、システムのプロセスをサンプリングおよび分析します。
    perfレコード-a -g睡眠10
  3. 次のコマンドを実行して、分析結果を表示します。
    perfレポート
    次のようなコマンド出力が返されます。
    31.04% [カーネル] [k] memcg_stat_show
    18.61% [カーネル] [k] memcg_sum_events.isra.22
    9.41% [カーネル] [k] mem_cgroup_iter
    6.94% [カーネル] [k] css_next_descendant_pre
    6.11% [カーネル] [k] _find_next_bit
    3.96% [カーネル] [k] mem_cgroup_usage.part.43
    1.75% [カーネル] [k] find_next_bit
    1.38% [カーネル] [k] mem_cgroup_node_nr_lru_pages
    コマンドの出力は、Linuxカーネルがmemcg_stat_show関数の実行時間の大部分を処理することを示しています。 メモリに対応するcgroupの数が過剰であり、システムがこれらのcgroupをトラバースするのに長い時間がかかるため、カーネルは長時間実行されます。

    さらに、cpuacctとcpuに対応するcgroupの数が多すぎると、完全公平スケジューラ (CFS) のパフォーマンスとLinuxカーネルの負荷分散メカニズムに影響を与える可能性があります。

ソリューション

LinuxインスタンスでO&Mを実行する場合、次のソリューションを使用して、cgroupによって引き起こされるアプリケーションのパフォーマンスジッタを防ぐことができます。
  • 各cgroup内に10個以下の子cgroupを作成します。
  • システムに1,000個以下のcgroupsを作成し、その数を可能な限り最小限に抑えます。