Bagaimana cara Throttle per proses I / O ke batas maksimal?


32

Saya sedang mencari cara untuk membatasi disk io proses ke batas kecepatan yang ditetapkan. Idealnya program ini bekerja seperti ini:

$ limitio --pid 32423 --write-limit 1M

Membatasi proses 32423 hingga 1 megabyte per detik kecepatan penulisan hard drive.

Jawaban:


33

Itu tentu bukan tugas sepele yang tidak bisa dilakukan di userspace. Untungnya, ini bisa dilakukan di Linux, menggunakan cgroupmechanizm dan pengontrol blkio -nya .

Menyiapkan cgroup adalah distribusi tertentu karena mungkin sudah dipasang atau bahkan digunakan di suatu tempat. Namun, inilah gagasan umum (dengan asumsi Anda memiliki konfigurasi kernel yang tepat):

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

Sekarang setelah Anda memiliki blkioset pengontrol, Anda dapat menggunakannya:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

Sekarang Anda memiliki cgroup limit1Myang membatasi kecepatan menulis pada perangkat dengan angka besar / kecil X: Y hingga 1MB / s. Seperti yang Anda lihat, batas ini adalah per perangkat. Yang harus Anda lakukan sekarang adalah memasukkan beberapa proses ke dalam grup itu dan itu harus dibatasi:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

Saya tidak tahu apakah ini bisa dilakukan pada sistem operasi lain.


3
Harap perhatikan bahwa Anda pertama-tama harus menetapkan kebijakan total luas perangkat untuk membuat sub-grup dengan echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicels -l /dev/sda
contoh

cgroup v1 tidak mendukung tindak lanjut cache. Itu berarti bahwa pengujian perintah penulisan dd sederhana ke file standar dalam sistem file (daripada ke perangkat) mungkin tidak akan menunjukkan batasan apa pun. Tidak menggunakan writeback akan berhasil: dd ... oflag=directakan bekerja seperti yang diharapkan. cgroup v2 dapat menangani ini jika filesystem mendukungnya. Detail: Menggunakan cgroup untuk membatasi I / O
AB

22

ionicedari util-linuxmelakukan sesuatu yang mirip dengan yang Anda inginkan.

Itu tidak menetapkan batas IO absolut, itu menetapkan prioritas IO dan 'kebaikan' - mirip dengan apa yang nicedilakukan untuk proses 'prioritas CPU.

Dari halaman manual:

ionice - set atau dapatkan kelas penjadwalan I / O proses dan prioritas

DESKRIPSI
Program ini menetapkan atau mendapatkan kelas penjadwalan I / O dan prioritas untuk a
program. Jika tidak ada argumen atau hanya -p yang diberikan, ionice akan menanyakan
kelas penjadwalan I / O saat ini dan prioritas untuk proses itu.

Ketika perintah diberikan, ionice akan menjalankan perintah ini dengan yang diberikan
argumen. Jika tidak ada kelas yang ditentukan, maka perintah akan dieksekusi
dengan kelas penjadwalan "upaya terbaik". Level prioritas default adalah 4.

5
Orang harus ingat bahwa itu hanya bekerja dengan CFQpenjadwal I / O. Banyak sistem modern memiliki deadlinesatu diaktifkan secara default.
Highstaker

8

systemd menyediakan pembungkus untuk doa proses yang dimanipulasi cgroup. Dari halaman manual systemd-run (1):

Perintah berikut memanggil alat updatedb (8), tetapi menurunkan bobot IO blok hingga 10. Lihat systemd.resource-control (5) untuk informasi lebih lanjut tentang properti BlockIOWeight = properti.
systemd-run -p BlockIOWeight=10 updatedb

Pertimbangkan untuk menggunakan --scopeopsi untuk systemd-runmenjalankan program di latar depan.


7

Jawaban fche adalah petunjuk yang sangat bagus, terima kasih untuk itu, meskipun itu tidak benar-benar menyelesaikan masalah karena pertanyaannya adalah membatasi proses ke bandwidth tertentu.

Saya akan menyarankan sesuatu seperti ini:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

atau versi yang sudah usang:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

Namun ini tidak sesuai dengan pertanyaan karena tidak dapat digunakan untuk proses yang sudah berjalan tetapi mungkin bermanfaat dalam beberapa kasus lain.

Tautan:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.