コントロールグループ (cgroup) は、システム上のリソースを割り当て、管理、監視するために使用できる Linux カーネルの機能です。cgroup の階層や数がシステムに対して適切でない場合、アプリケーションのパフォーマンスが低下する可能性があります。このトピックでは、cgroup に起因するアプリケーションパフォーマンスのジッターの問題と、その発生を防ぐ方法について説明します。
問題の説明
コンテナーベースのシナリオでは、アプリケーションでリクエストのレイテンシーが時折増加することがあります。同時に、コンテナーのホストにおける `sys` CPU 使用率が 30% 以上に達します。`sys` メトリックは、カーネル空間で費やされた CPU 時間の割合です。たとえば、top コマンドを実行して Linux のパフォーマンスデータを確認すると、`sy` の値が 30% 以上になります。
top - 16:21:19 up 22 days, 1:59, 3 users, load average: 40.02, 30.02, 25.06
Tasks: 193 total, 3 running, 190 sleeping, 0 stopped, 0 zombie
%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 total, 2071424 free, 1832512 used, 20226872 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 19737776 avail Mem考えられる原因
たとえば、cat /proc/cgroups コマンドを実行してすべての cgroup のステータスを表示すると、出力からメモリの cgroup 数が 2,040 にも達していることがわかる場合があります。
#subsys_name hierarchy num_cgroups enabled
cpuset 2 200 1
cpu 2 200 1
cpuacct 2 200 1
blkio 6 62 1
memory 10 2040 1
devices 5 59 1この場合、perf を使用して問題を分析し、原因を特定できます。
次のコマンドを実行して perf をインストールします:
yum install perf -y次のコマンドを実行して、システムのプロセスをサンプリングおよび分析します:
perf record -a -g sleep 10次のコマンドを実行して、分析結果を表示します:
perf report以下に出力例を示します:
31.04% [kernel] [k] memcg_stat_show 18.61% [kernel] [k] memcg_sum_events.isra.22 9.41% [kernel] [k] mem_cgroup_iter 6.94% [kernel] [k] css_next_descendant_pre 6.11% [kernel] [k] _find_next_bit 3.96% [kernel] [k] mem_cgroup_usage.part.43 1.75% [kernel] [k] find_next_bit 1.38% [kernel] [k] mem_cgroup_node_nr_lru_pages分析結果は、Linux カーネルの実行時間の大半が
memcg_stat_show関数で費やされていることを示しています。これは、メモリに関連付けられた cgroup の数が過剰であるため、カーネルがそれらを走査するのに長い時間がかかることが原因です。さらに、cpuacct と cpu に対応する cgroup の数が過剰になると、Completely Fair Scheduler (CFS) のパフォーマンスや Linux カーネルの負荷分散メカニズムにも影響を与える可能性があります。
解決策
Linux インスタンスで運用保守 (O&M) を行う際、cgroup に起因するアプリケーションパフォーマンスのジッターを防ぐには、以下の点を推奨します。
cgroup 階層を 10 レベル以下に維持します。
cgroup の総数を 1,000 以下に制限します。cgroup の数はできるだけ少なくしてください。