Control groups (cgroups) adalah fitur kernel Linux yang digunakan untuk mengalokasikan, mengelola, dan memantau sumber daya sistem. Jika hierarki atau jumlah cgroups tidak sesuai dengan kebutuhan sistem, kinerja aplikasi dapat menurun. Topik ini menjelaskan masalah jitter kinerja aplikasi yang disebabkan oleh cgroups serta cara mencegahnya.
Deskripsi masalah
Dalam skenario bisnis terkait kontainer, aplikasi pada sistem kadang-kadang mengalami peningkatan latensi permintaan, dan data deret waktu sys (persentase CPU yang digunakan oleh kernel) mencapai 30% atau lebih tinggi dalam penggunaan CPU host tempat kontainer diterapkan. Sebagai contoh, ketika Anda menjalankan perintah top untuk melihat data kinerja Linux, data deret waktu sys mencapai 30%, seperti yang ditunjukkan oleh nilai sy dalam output perintah berikut:
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 : 24.130.808 total, 2.071.424 free, 1.832.512 used, 20.226.872 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 19.737.776 avail MemPenyebab yang mungkin
Ketika Anda menjalankan perintah cat /proc/cgroups untuk melihat status semua cgroups, Anda menemukan bahwa jumlah cgroups yang sesuai dengan memori mencapai 2.040, seperti yang ditunjukkan dalam output perintah berikut:
#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 1Dalam kasus ini, Anda dapat menggunakan perf untuk menganalisis dan mengidentifikasi penyebab masalah tersebut.
- Jalankan perintah berikut untuk menginstal perf:
yum install perf -y - Jalankan perintah berikut untuk melakukan sampling dan menganalisis proses sistem:
perf record -a -g sleep 10 - Jalankan perintah berikut untuk melihat hasil analisis:
perf reportOutput perintah serupa dengan yang berikut ini dikembalikan:
Output perintah menunjukkan bahwa kernel Linux menghabiskan sebagian besar waktunya untuk memproses fungsi31.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_pagesmemcg_stat_show. Kernel berjalan dalam waktu lama karena jumlah cgroups yang sesuai dengan memori berlebihan dan sistem membutuhkan waktu lama untuk menelusuri cgroups tersebut.Selain itu, jumlah cgroups yang berlebihan yang sesuai dengan cpuacct dan cpu juga dapat memengaruhi kinerja Completely Fair Scheduler (CFS) dan mekanisme penyeimbangan beban kernel Linux.
Solusi
Saat melakukan operasi & pemeliharaan pada instance Linux, gunakan solusi berikut untuk mencegah jitter kinerja aplikasi yang disebabkan oleh cgroups:
- Buat tidak lebih dari 10 cgroups anak di dalam setiap cgroup.
- Buat tidak lebih dari 1.000 cgroups dalam sistem dan pertahankan jumlahnya seminimal mungkin.