Alibaba Cloud Linux 2 (çekirdek sürümü 4.19.36-12.al7 ve sonrası) ile Alibaba Cloud Linux 3'te, cgroup v1 çekirdek arayüzü için cgroup writeback özelliği kullanılabilir. Bu özellik, arabelleğe alınmış G/Ç hızını sınırlamanızı sağlar.
Arka plan bilgileri
Bu konuda cgroup olarak adlandırılan kontrol grupları, kaynak tahsisi yapmanızı sağlayan bir Linux çekirdeği özelliğidir. cgroup'lar iki sürümde mevcuttur: cgroup v1 ve cgroup v2. Daha fazla bilgi için Kaynak Yönetimi Kılavuzu'ndaki Kontrol Grupları Nedir? bölümüne bakın. Bu konu, işlemlerin arabelleğe alınmış G/Ç hızını sınırlamak amacıyla cgroup v1 için cgroup writeback özelliğinin nasıl etkinleştirileceğini açıklar.
Sınırlamalar
cgroup writeback özelliğini etkinleştirdikten sonra, bellek alt sistemi (memcg) ile G/Ç alt sistemi (blkcg) arasındaki eşlemenin bu bölümde açıklanan kurallara uygun olduğundan emin olun. Bu durum, işlemler için arabelleğe alınmış G/Ç hızını sınırlamak için gereklidir.
cgroup writeback özelliği, arabelleğe alınmış G/Ç hızını sınırlamak üzere memcg ve blkcg'nin birlikte çalışmasını gerektirir. Varsayılan olarak, cgroup v1'in kontrol alt sistemleri birlikte çalışmaz. Bu nedenle, memcg ve blkcg'yi belirli bir kurala göre bağlamanız gerekir: her bir memcg tek bir blkcg ile eşlenmelidir. Eşleme birebir veya çoka-bir olabilir; ancak bire-çok veya çoka-çok olamaz.
Örneğin, A ve B işlemleri için arabelleğe alınmış G/Ç hızını sınırlamak istediğinizde aşağıdaki kısıtlamalar geçerlidir.
A ve B farklı memcg'lere aitse, birebir ilişkiyle farklı blkcg'lere eşlenebilirler. Örneğin, A
memcg1veblkcg1öğelerine; B isememcg2veblkcg0öğelerine aittir.A ve B farklı memcg'lere ait olsa da aynı blkcg'ye eşlenebilirler. Örneğin, A
memcg1öğesine ve Bmemcg2öğesine aitken, hem A hem de Bblkcg2öğesine aittir.A ve B aynı memcg'ye aitse, aynı blkcg ile eşlenmeleri gerekir. Örneğin, A ve B'nin her ikisi de
memcg0veblkcg3öğelerine ait olabilir.
cgroup writeback etkinleştirildikten sonra beklenmeyen sorunları önlemek için, arabelleğe alınmış G/Ç hızını sınırlamadan önce blkcg için cgroup.procs arayüzünü ayarlayın. Benzersiz bir blkcg eşlemesi sağlamak amacıyla bu arayüze bir işlem kimliği yazabilirsiniz. Ayrıca, memcg ile blkcg arasındaki eşlemeyi görüntülemek için araçlardan yararlanabilirsiniz. Daha fazla bilgi için bkz. memcg ve blkcg arasındaki eşlemeyi doğrulayın.
İşletim ve bakım (O&M) sırasında bir işlem başka bir cgroup'a taşınabilir. Eşleme kuralına göre, bir işlem memcg'ler arasında taşındığında sorun oluşmaz. Ancak, bir işlem blkcg'ler arasında taşındığında sorun meydana gelir. Bunu önlemek için özelliğin kodunda şu kural bulunur: Aktif bir blkcg'deki bir işlem başka bir blkcg'ye taşınırsa, eşleme kök blkcg'ye sıfırlanır. Kök blkcg'de genellikle bir hız sınırı eşiği ayarlanmadığından, hız sınırlama özelliği artık etkili olmaz.
Çekirdek kodunda beklenmeyen sorunları önleyen bir kural bulunsa da, işletim sırasında işlemleri blkcg'ler arasında taşımaktan kaçınmanız önerilir.
cgroup writeback özelliğini etkinleştirin
cgroup writeback özelliği, cgroup v1 arayüzü için varsayılan olarak devre dışıdır. Özelliği etkinleştirmek için aşağıdaki adımları izleyin.
-
Özelliği etkinleştirmek için
grubbykomutunu kullanarakcgwb_v1alanını ekleyin.Bu örnekte çekirdek sürümü
4.19.36-12.al7.x86_64olarak belirtilmiştir. Bu değeri kendi gerçek çekirdek sürümünüzle değiştirin. Çekirdek sürümünüzü kontrol etmek içinuname -rkomutunu çalıştırabilirsiniz.sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1" -
Değişikliklerin etkili olması için sistemi yeniden başlatın.
sudo reboot -
Aşağıdaki komutu çalıştırarak
/proc/cmdlineçekirdek dosyasını okuyun ve çekirdek komut satırı parametrelerinincgwb_v1alanını içerdiğini doğrulayın. Bu işlem, blkcg içindekiblkio.throttle.write_bps_deviceveblkio.throttle.write_iops_devicearayüzlerini etkinleştirerek arabelleğe alınmış G/Ç hızını sınırlar.cat /proc/cmdline | grep cgwb_v1
Kubernetes (k8s) ortamında, cgroup writeback özelliğini etkinleştirdikten sonra memory ve blkio cgroup alt sistemlerini de birleştirmeniz gerekir. Bu işlem, bir işlem taşındığında hız sınırlamanın başarısız olmasını önler.
-
memory ve blkio cgroup alt sistemlerini birleştirin.
-
system.conf dosyasını düzenleyin.
sudo vim /etc/systemd/system.conf -
JoinControllers yapılandırmasını değiştirin. Örnek:
JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio Düzenleme modundan çıkmak için Esc tuşuna basın. Ardından, kaydetmek ve çıkmak için :wq girin.
-
-
systemd yapılandırma değişikliklerinin etkili olması için başlangıç RAM disk görüntüsünü yeniden oluşturmak üzere aşağıdaki komutu çalıştırın.
sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12.al7.x86_64 --force -
Sistemi yeniden başlatmak için aşağıdaki komutu çalıştırın.
sudo reboot -
memory ve blkio alt sistemlerinin birleştirildiğini doğrulamak için aşağıdaki komutu çalıştırın.
ls /sys/fs/cgroup
cgroup writeback işlevinin etkili olduğunu doğrulayın
Bu örnek, cgroup writeback özelliğinin etkili olduğunu doğrulamak amacıyla G/Ç oluşturan iki işlemi simüle eder.
ddkomutu hızlı geri bildirim sağlar. Sonuçları görüntülemek içiniostatkomutunu kullanabilirsiniz.ddkomutu verileri sıralı olarak yazar. Sıralı bir G/Ç yenilemesi sırasında sistem verileri 1 MB'lık parçalar halinde geri yazar. Bu nedenle,blkio.throttle.write_bps_deviceeşiğini en az 1 MB (1048576) olacak şekilde ayarlayın. 1 MB'den küçük bir değer belirlerseniz G/Ç işlemi askıda kalabilir.
-
G/Ç oluşturan iki işlemi simüle edin. Sınırlamaların gerektirdiği gibi, öncelikle blkcg'nin
cgroup.procsarayüzünü ayarlayın.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" # $$ is your process ID sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$ is your process ID -
Arabelleğe alınmış G/Ç hızını sınırlamak için blkcg içindeki
blkio.throttle.write_bps_devicearayüzünü kullanın.sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" # Set the disk write-back rate limit to 10 MB/s based on the device number. -
Önbelleğe alınmış zaman uyumsuz G/Ç oluşturmak için
oflag=syncparametresi olmadanddkomutunu kullanın.sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000 -
Sonuçları sorgulamak için iostat aracını kullanın. Çıktıdaki
wMB/ssütununu kontrol edin. Hız yaklaşık 10 MB/s ile sınırlandırılmışsa cgroup writeback özelliği doğru çalışıyor demektir.iostat -xdm 1 vdd
memcg ve blkcg arasındaki eşlemeyi doğrulayın
memcg ve blkcg arasındaki eşlemenin birebir veya çoka-bir olduğunu doğrulamak için aşağıdaki yöntemlerden birini kullanabilirsiniz.
-
memcg ve blkcg arasındaki eşlemeyi görüntüleyin.
sudo cat /sys/kernel/debug/bdi/bdi_wb_linkAşağıdaki örnek çıktı, memcg ve blkcg arasında birebir bir eşleme olduğunu göstermektedir.
memory <---> blkio memcg1: 35 <---> blkcg1: 48 -
ftrace çekirdek izleme aracını kullanın.
-
ftrace aracını etkinleştirin.
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable" -
Çıktı bilgilerini görüntüleyebilirsiniz.
sudo cat /sys/kernel/debug/tracing/trace_pipeAşağıdaki örnek çıktı
memcg_ino=35 blkcg_ino=48değerlerini göstermektedir. Bu durum, memcg ve blkcg arasında birebir bir eşleme bulunduğunu belirtir.<...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0
-