Alibaba Cloud Linux 2 menyediakan fitur cgroup writeback untuk antarmuka kernel cgroup v1 pada versi kernel 4.19.36-12.al7 dan yang lebih baru. Fitur ini memungkinkan Anda membatasi laju I/O ter-buffer saat menggunakan antarmuka kernel cgroup v1.
Informasi latar belakang
Control groups, disingkat sebagai cgroups dalam topik ini, adalah fitur kernel Linux yang memungkinkan Anda mengalokasikan sumber daya. Cgroups tersedia dalam dua versi: cgroup v1 dan cgroup v2. Untuk informasi lebih lanjut, lihat bagian Apa itu Control Groups dalam Panduan Manajemen Sumber Daya. 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, periksa apakah pemetaan antara subsistem memori (memcgs) dan subsistem I/O (blkcgs) sesuai dengan aturan berikut. Jika pemetaan sesuai, batasi laju I/O ter-buffer dari proses.
Fitur cgroup writeback memerlukan kerja sama antara memcgs dan blkcgs untuk membatasi laju I/O ter-buffer. Namun, secara default, subsistem kontrol cgroup v1 tidak bekerja sama satu sama lain. Memcgs dan blkcgs harus dikaitkan berdasarkan aturan bahwa setiap memcg dipetakan ke blkcg unik. Pemetaan dari memcgs ke blkcgs dapat bersifat satu-satu atau banyak-satu, tetapi tidak boleh satu-banyak atau banyak-banyak.
Sebagai contoh, untuk membatasi laju I/O ter-buffer Proses A dan B, perhatikan hal-hal berikut:
Ketika A dan B termasuk dalam dua memcg berbeda, masing-masing memcg dapat dipetakan ke blkcg unik. Sebagai contoh, A termasuk dalam
memcg1danblkcg1, dan B termasuk dalammemcg2danblkcg0.Ketika A dan B termasuk dalam dua memcg berbeda, memcg tersebut juga dapat dipetakan ke blkcg yang sama. Sebagai contoh, A termasuk dalam
memcg1dan B termasuk dalammemcg2, dan baik A maupun B dapat termasuk dalamblkcg2.Ketika A dan B termasuk dalam memcg yang sama, memcg tersebut hanya dapat dipetakan ke satu blkcg. Sebagai contoh, A dan B termasuk dalam
memcg0danblkcg3.
Untuk mencegah pengecualian, kami sarankan Anda melakukan operasi berikut setelah mengaktifkan fitur cgroup writeback tetapi sebelum membatasi laju I/O ter-buffer suatu proses: Konfigurasikan antarmuka cgroup.procs untuk blkcg yang sesuai, dan tulis ID proses ke antarmuka tersebut untuk memastikan bahwa memcgs yang dipetakan ke blkcg ini tidak dipetakan ke blkcgs lainnya. Anda juga dapat menggunakan alat untuk melihat pemetaan antara memcgs dan blkcgs. Untuk informasi lebih lanjut, lihat Verifikasi pemetaan dari memcgs ke blkcgs.
Selama O&M, proses mungkin berpindah ke cgroups yang berbeda. Berdasarkan aturan sebelumnya, tidak ada pengecualian yang terjadi jika proses bergerak di antara memcgs. Namun, jika proses bergerak di antara blkcgs, pengecualian mungkin terjadi. Aturan berikut didefinisikan dalam kode fitur cgroup writeback untuk mencegah pengecualian: Jika proses dalam blkcg yang sedang berjalan berpindah ke blkcg lain, memcg tempat proses tersebut berada dipetakan ke blkcg root. Biasanya, tidak ada ambang batas throttling yang ditetapkan untuk blkcg root. Ketika memcg dipetakan ke blkcg root, fitur throttling tidak lagi berlaku.
Meskipun aturan sebelumnya didefinisikan dalam kode kernel, kami sarankan Anda tidak memindahkan proses di antara blkcgs.
Aktifkan fitur cgroup writeback
Secara default, fitur cgroup writeback dinonaktifkan untuk antarmuka cgroup v1. Untuk mengaktifkan fitur ini, lakukan langkah-langkah berikut:
Tambahkan bidang
cgwb_v1ke perintahgrubbydan jalankan perintah tersebut untuk mengaktifkan fitur cgroup writeback.Dalam contoh ini, versi kernel adalah
4.19.36-12.al7.x86_64. Anda harus memasukkan versi kernel aktual Anda selama operasi. Untuk menanyakan versi kernel Anda, jalankan perintahuname -r.sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1"Mulai ulang sistem agar fitur cgroup writeback berlaku.
sudo rebootJalankan perintah berikut untuk membaca file kernel
/proc/cmdline. Pastikan parameter perintah mencakup bidangcgwb_v1. Dengan cara ini, antarmukablkio.throttle.write_bps_devicedanblkio.throttle.write_iops_devicedalam blkcgs yang sesuai dapat membatasi laju I/O ter-buffer.cat /proc/cmdline | grep cgwb_v1
Dalam lingkungan Kubernetes, setelah Anda mengaktifkan fitur cgroup writeback untuk membatasi laju I/O ter-buffer suatu proses, Anda harus mengaitkan memcg dengan blkcg untuk mencegah throttling dinonaktifkan karena pergerakan proses.
Kaitkan memcg dengan blkcg.
Edit file system.conf.
sudo vim /etc/systemd/system.confUbah konfigurasi JoinControllers. Contoh:
JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkioTekan tombol Esc untuk keluar dari mode Insert, dan masukkan :wq untuk menyimpan file dan keluar.
Jalankan perintah berikut untuk membuat ulang gambar kernel untuk memastikan konfigurasi systemd baru berlaku:
sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12.al7.x86_64 --forceJalankan perintah berikut untuk memulai ulang sistem:
sudo rebootJalankan perintah berikut untuk memeriksa apakah blkcg dan memcg terkait:
ls /sys/fs/cgroup
Periksa apakah fitur cgroup writeback berlaku
Dalam contoh ini, dua proses yang menghasilkan I/O disimulasikan untuk memeriksa apakah fitur cgroup writeback berlaku.
Perintah
ddmerespons dengan cepat dan layar bergulir terlalu cepat untuk dilihat. Jalankan perintahiostatuntuk melihat keluaran perintah dd.Perintah
ddmenulis data secara berurutan. Sistem melakukan penyegaran I/O berurutan setiap kali 1 MB data keluaran dihasilkan. Oleh karena itu, Anda harus menetapkan ambang batas untukblkio.throttle.write_bps_devicemenjadi nilai tidak kurang dari 1 MB (1.048.576 byte). Jika Anda menetapkan ambang batas untuk blkio.throttle.write_bps_device menjadi nilai kurang dari 1 MB, kemacetan I/O mungkin terjadi.
Simulasikan dua proses yang menghasilkan I/O, dan atur antarmuka
cgroup.procsblkcg berdasarkan batasan sebelumnya.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" # $$ tentukan ID proses. sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$ tentukan ID proses.Gunakan antarmuka
blkio.throttle.write_bps_devicedalam 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" # Tetapkan ambang batas throttling writeback untuk disk menjadi 10 MB/s berdasarkan nomor perangkat.Gunakan perintah
ddyang tidak memilikioflagdiatur ke sync untuk menghasilkan I/O ter-buffer.sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000Gunakan alat iostat untuk menanyakan hasilnya. Lihat kolom
wMB/sdalam keluaran perintah. Jika nilainya 10 MB/s, fitur cgroup writeback berlaku.iostat -xdm 1 vdd
Verifikasi pemetaan dari memcgs ke blkcgs
Anda dapat menggunakan salah satu metode berikut untuk memeriksa apakah pemetaan dari memcgs ke blkcgs bersifat satu-satu atau banyak-satu.
Jalankan perintah berikut untuk melihat pemetaan dari memcgs ke blkcgs:
sudo cat /sys/kernel/debug/bdi/bdi_wb_linkContoh tanggapan berikut menunjukkan bahwa pemetaan dari memcg ke blkcg bersifat satu-satu.
memory <---> blkio memcg1: 35 <---> blkcg1: 48Gunakan alat pemantauan kernel ftrace.
Gunakan alat ftrace.
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable"Lihat informasi keluaran.
sudo cat /sys/kernel/debug/tracing/trace_pipeContoh tanggapan berikut berisi
memcg_ino=35 blkcg_ino=48, yang menunjukkan bahwa pemetaan dari memcg ke blkcg bersifat satu-satu.<...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0