Control groups (cgroups), Linux üzerinde sistem kaynaklarını tahsis eder, yönetir ve izler. Cgroup sayısı veya hiyerarşi derinliği aşırı arttığında çekirdek, cgroup yapılarını taramak için gereğinden fazla CPU zamanı harcar; bu durum uygulama performansını düşürür.
Belirtiler
Konteyner ortamlarında bu sorun şu şekilde ortaya çıkar:
Aralıklı gecikme süresi artışları -- Uygulamalar zaman zaman istek gecikme süresinde ani bir artış yaşar.
Yüksek çekirdek CPU kullanımı -- Konteyner ana bilgisayarında
sysölçümü (çekirdek CPU yüzdesi) %30 veya daha yüksek değerlere ulaşır.
Çekirdek CPU kullanımını kontrol etmek için top komutunu çalıştırın. Aşağıdaki çıktıda sy değerinin %30,0 olması çekirdeğin CPU zamanının önemli bir kısmını tükettiğini gösterir:
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
Teşhis
Cgroup sayısını kontrol edin
Cgroup durumlarını görüntülemek için aşağıdaki komutu çalıştırın:
cat /proc/cgroups
Çıktı, her cgroup alt sistemini dört sütunla listeler:
| Sütun | Açıklama |
|---|---|
subsys_name |
Cgroup denetleyicisi adı |
hierarchy |
Bu denetleyicinin bağlandığı cgroup hiyerarşisinin kimliği |
num_cgroups |
Bu denetleyiciyi kullanan cgroup sayısı |
enabled |
Bu denetleyicinin etkin (1) veya devre dışı (0) olup olmadığı |
Örnek çıktı:
#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
Bu örnekte memory denetleyicisi 2.040 cgroup'a sahiptir; bu değer önerilen 1.000 sınırının oldukça üzerindedir.
Perf ile çekirdek CPU kullanımını profilleyin
Cgroup taramasının CPU zamanı tükettiğini doğrulamak için çekirdek çağrılarını örneklemek üzere perf aracını kullanın.
-
perfaracını yükleyin:yum install perf -y -
Sistem genelindeki aktiviteyi 10 saniye boyunca örnekleyin:
perf record -a -g sleep 10 -
Sonuçları görüntüleyin: Soruna cgroups neden oluyorsa çıktı, memory cgroup işlevlerinin çekirdek CPU zamanına hakim olduğunu gösterir:
perf report31.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
Kök neden
memcg_stat_show işlevi tüm memory cgroup'lar arasındaki istatistikleri toplar. Memory cgroup sayısı aşırı yüksek olduğunda bunların taranması uzun sürer ve önemli miktarda çekirdek CPU tüketir. Yukarıdaki perf çıktısında yalnızca memcg_stat_show işlevi CPU zamanının %31'ini kapsamaktadır.
Aşırı sayıda cpuacct ve cpu cgroup'u da Linux çekirdeğinin Completely Fair Scheduler (CFS) ve yük dengeleme mekanizmasını etkileyebilir.
Önleme yönergeleri
Alibaba Cloud Linux örneklerinizde cgroup kaynaklı performans dalgalanmalarını önlemek için:
Üst cgroup başına alt cgroup sayısını sınırlayın -- Her cgroup içinde 10'dan fazla alt cgroup oluşturmayın.
Toplam cgroup sayısını sınırlayın -- Sistem genelindeki toplam cgroup sayısını 1.000'in altında tutun. Cgroup sayısı ne kadar az olursa o kadar iyidir.