控制群組(control group)簡稱為cgroup,是Linux的內核功能。系統通過cgroup可以對系統內的資源進行分配、管理、監控等操作。不合理的cgroup層級或數量可能引起系統中應用性能的不穩定。本文主要介紹問題現象以及如何避免該類問題的出現。
問題現象
在容器相關的業務場景下,系統中的應用偶然會出現請求延時增大,并且容器所屬宿主機的CPU使用率中,sys指標(內核空間占用CPU的百分比)達到30%及以上。例如,通過top命令查看Linux系統性能數據時,CPU的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 查看當前所有控制群組的狀態,發現memory對應的cgroup數目高達2040。
#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
函數,這是由于memory對應的cgroup數量過多,系統在遍歷這些cgroup所導致的內核長時間運行。除了memory之外,cpuacct、cpu對應的cgroup過多還可能使CFS、load-balance的性能受影響。
解決方案
當您對Linux實例運維時,可參考以下兩條建議,避免因cgroup引起的應用性能抖動。
cgroup的層級建議不超過10層。
cgroup的數量上限建議不超過1000,且應當盡可能地減少cgroup的數量。
文檔內容是否對您有幫助?