Di Alibaba Cloud Linux 2 (versi kernel 4.19.36-12.al7 dan yang lebih baru) serta Alibaba Cloud Linux 3, fitur cgroup writeback tersedia untuk antarmuka kernel cgroup v1. Fitur ini memungkinkan Anda membatasi laju I/O ter-buffer.
Informasi latar belakang
Control groups, yang dalam topik ini disebut cgroups, adalah fitur kernel Linux yang memungkinkan Anda mengalokasikan resource. cgroups tersedia dalam dua versi: cgroup v1 dan cgroup v2. Untuk informasi selengkapnya, lihat bagian What are Control Groups dalam Resource Management Guide. Topik ini menjelaskan cara mengaktifkan fitur cgroup writeback untuk cgroup v1 guna membatasi laju I/O ter-buffer dari proses.
Batasan
Setelah mengaktifkan fitur cgroup writeback, Anda harus memastikan bahwa pemetaan antara subsistem memory (memcg) dan subsistem I/O (blkcg) mengikuti aturan yang dijelaskan dalam bagian ini. Hal ini diperlukan untuk membatasi laju I/O ter-buffer bagi proses.
Fitur cgroup writeback mengharuskan memcg dan blkcg bekerja secara bersamaan untuk membatasi laju I/O ter-buffer. Secara default, subsistem kontrol cgroup v1 tidak bekerja sama. Oleh karena itu, Anda harus menghubungkan memcg dan blkcg berdasarkan aturan tertentu: setiap memcg hanya boleh dipetakan ke satu blkcg. Pemetaannya dapat bersifat satu-ke-satu atau banyak-ke-satu, tetapi tidak boleh satu-ke-banyak atau banyak-ke-banyak.
Sebagai contoh, untuk membatasi laju I/O ter-buffer bagi proses A dan B, berlaku batasan berikut.
Jika A dan B berada dalam memcg yang berbeda, keduanya dapat dipetakan ke blkcg yang berbeda dalam hubungan satu-ke-satu. Misalnya, A berada dalam
memcg1danblkcg1, sedangkan B berada dalammemcg2danblkcg0.Jika A dan B berada dalam memcg yang berbeda, keduanya juga dapat dipetakan ke blkcg yang sama. Misalnya, A berada dalam
memcg1dan B berada dalammemcg2, tetapi keduanya berada dalamblkcg2.Jika A dan B berada dalam memcg yang sama, keduanya harus dipetakan ke blkcg yang sama. Misalnya, A dan B keduanya dapat berada dalam
memcg0danblkcg3.
Untuk mencegah masalah tak terduga setelah mengaktifkan cgroup writeback, atur antarmuka cgroup.procs untuk blkcg sebelum membatasi laju I/O ter-buffer. Anda dapat menuliskan ID proses ke antarmuka ini untuk memastikan pemetaan blkcg yang unik. Anda juga dapat menggunakan tool untuk melihat pemetaan antara memcg dan blkcg. Untuk informasi selengkapnya, lihat Konfirmasi pemetaan antara memcg dan blkcg.
Selama operasi dan maintenance (O&M), sebuah proses mungkin dipindahkan ke cgroup lain. Berdasarkan aturan pemetaan, tidak akan terjadi masalah jika proses dipindahkan antar memcg. Namun, jika proses dipindahkan antar blkcg, akan terjadi masalah. Untuk mencegah hal ini, kode fitur mencakup aturan berikut: jika proses dalam blkcg aktif dipindahkan ke blkcg lain, pemetaannya akan diatur ulang ke root blkcg. Akibatnya, fitur pembatasan laju tidak lagi berlaku karena ambang batas pembatasan laju biasanya tidak ditetapkan pada root blkcg.
Meskipun kode kernel mencakup aturan untuk mencegah masalah tak terduga, Anda sebaiknya menghindari pemindahan proses antar blkcg selama operasi.
Aktifkan fitur cgroup writeback
Fitur cgroup writeback dinonaktifkan secara default untuk antarmuka cgroup v1. Ikuti langkah-langkah berikut untuk mengaktifkannya.
Tambahkan bidang
cgwb_v1menggunakan perintahgrubbyuntuk mengaktifkan fitur tersebut.Dalam contoh ini, versi kernel adalah
4.19.36-12.al7.x86_64. Gantilah dengan versi kernel aktual Anda. Anda dapat menjalankan perintahuname -runtuk memeriksa versi kernel Anda.sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1"Restart sistem agar perubahan diterapkan.
sudo rebootJalankan perintah berikut untuk membaca file kernel
/proc/cmdlinedan pastikan parameter baris perintah kernel mencakup bidangcgwb_v1. Hal ini mengaktifkan antarmukablkio.throttle.write_bps_devicedanblkio.throttle.write_iops_devicedi blkcg untuk membatasi laju I/O ter-buffer.cat /proc/cmdline | grep cgwb_v1
Dalam lingkungan Kubernetes (k8s), setelah mengaktifkan fitur cgroup writeback, Anda juga harus menggabungkan subsistem cgroup memory dan blkio. Hal ini mencegah kegagalan pembatasan laju jika suatu proses dipindahkan.
Gabungkan subsistem cgroup memory dan blkio.
Edit file system.conf.
sudo vim /etc/systemd/system.confUbah konfigurasi JoinControllers. Contohnya:
JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkioTekan tombol Esc untuk keluar dari mode edit. Lalu, masukkan :wq untuk menyimpan dan keluar.
Jalankan perintah berikut untuk membuat ulang image initial RAM disk. Hal ini memastikan perubahan konfigurasi systemd diterapkan.
sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12.al7.x86_64 --forceJalankan perintah berikut untuk restart sistem.
sudo rebootJalankan perintah berikut untuk memverifikasi bahwa subsistem memory dan blkio telah digabung.
ls /sys/fs/cgroup
Verifikasi bahwa cgroup writeback berlaku
Contoh ini mensimulasikan dua proses yang menghasilkan I/O untuk memverifikasi bahwa fitur cgroup writeback berlaku.
Perintah
ddmemberikan umpan balik cepat. Anda dapat menggunakan perintahiostatuntuk melihat hasilnya.Perintah
ddmenulis data secara sekuensial. Selama refresh I/O sekuensial, sistem melakukan write-back data dalam chunk berukuran 1 MB. Oleh karena itu, atur ambang batasblkio.throttle.write_bps_deviceke nilai minimal 1 MB (1048576). Jika Anda menetapkan nilai kurang dari 1 MB, proses I/O mungkin hang.
Simulasikan dua proses yang menghasilkan I/O. Sesuai persyaratan batasan, atur terlebih dahulu antarmuka
cgroup.procsdari blkcg.sudo mkdir /sys/fs/cgroup/blkio/blkcg1 sudo mkdir /sys/fs/cgroup/memory/memcg1 sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$ adalah ID proses Anda sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$ adalah ID proses AndaGunakan antarmuka
blkio.throttle.write_bps_devicedi blkcg untuk membatasi laju I/O ter-buffer.sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" # Atur batas laju write-back disk menjadi 10 MB/s berdasarkan nomor perangkat.Gunakan perintah
ddtanpa parameteroflag=syncuntuk menghasilkan I/O asinkron ter-cache.sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000Gunakan tool iostat untuk menanyakan hasilnya. Periksa kolom
wMB/sdalam output. Jika laju dibatasi sekitar 10 MB/s, berarti fitur cgroup writeback berfungsi dengan benar.iostat -xdm 1 vdd
Konfirmasi pemetaan antara memcg dan blkcg
Anda dapat menggunakan salah satu metode berikut untuk memastikan bahwa pemetaan antara memcg dan blkcg bersifat satu-ke-satu atau banyak-ke-satu.
Lihat pemetaan antara memcg dan blkcg.
sudo cat /sys/kernel/debug/bdi/bdi_wb_linkOutput contoh berikut menunjukkan bahwa memcg dan blkcg memiliki pemetaan satu-ke-satu.
memory <---> blkio memcg1: 35 <---> blkcg1: 48Gunakan tool pemantauan kernel ftrace.
Aktifkan tool ftrace.
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable"Anda dapat melihat informasi output.
sudo cat /sys/kernel/debug/tracing/trace_pipeOutput contoh berikut menampilkan
memcg_ino=35 blkcg_ino=48. Hal ini menunjukkan bahwa memcg dan blkcg memiliki pemetaan satu-ke-satu.<...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0