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 berbasis container, aplikasi kadang-kadang mengalami peningkatan latensi permintaan. Secara bersamaan, penggunaan CPU sys pada host container mencapai 30% atau lebih. Metrik sys merepresentasikan persentase waktu CPU yang dihabiskan di kernel space. Misalnya, ketika Anda menjalankan perintah top untuk melihat data performa Linux, nilai sy menunjukkan angka 30% atau lebih tinggi.
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 MemPenyebab yang mungkin
Sebagai contoh, jika Anda menjalankan perintah cat /proc/cgroups untuk melihat status semua cgroups, output-nya mungkin menunjukkan bahwa jumlah cgroups untuk memory mencapai 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 1Dalam kasus ini, Anda dapat menggunakan perf untuk menganalisis dan mengidentifikasi penyebab masalah tersebut.
Jalankan perintah berikut untuk menginstal perf:
yum install perf -yJalankan perintah berikut untuk melakukan sampling dan menganalisis proses sistem:
perf record -a -g sleep 10Jalankan perintah berikut untuk melihat hasil analisis:
perf reportBerikut ini contoh output-nya:
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_pagesHasil analisis menunjukkan bahwa sebagian besar waktu proses kernel Linux dihabiskan dalam fungsi
memcg_stat_show. Hal ini terjadi karena jumlah cgroups yang terkait dengan memory terlalu banyak, sehingga menyebabkan kernel menghabiskan waktu lama untuk melakukan traversal.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 dan maintenance (O&M) pada instans Linux, ikuti saran berikut untuk mencegah jitter performa aplikasi yang disebabkan oleh cgroups.
Pertahankan hierarki cgroup hingga maksimal 10 level.
Batasi jumlah total cgroups hingga maksimal 1.000. Usahakan jumlah cgroups serendah mungkin.