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:
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.
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.
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.
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.
Namun ini tidak sesuai dengan pertanyaan karena tidak dapat digunakan untuk proses yang sudah berjalan tetapi mungkin bermanfaat dalam beberapa kasus lain.
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
ls -l /dev/sda
dd ... oflag=direct
akan bekerja seperti yang diharapkan. cgroup v2 dapat menangani ini jika filesystem mendukungnya. Detail: Menggunakan cgroup untuk membatasi I / Oionice
dariutil-linux
melakukan sesuatu yang mirip dengan yang Anda inginkan.Itu tidak menetapkan batas IO absolut, itu menetapkan prioritas IO dan 'kebaikan' - mirip dengan apa yang
nice
dilakukan untuk proses 'prioritas CPU.Dari halaman manual:
sumber
CFQ
penjadwal I / O. Banyak sistem modern memilikideadline
satu diaktifkan secara default.systemd menyediakan pembungkus untuk doa proses yang dimanipulasi cgroup. Dari halaman manual systemd-run (1):
Pertimbangkan untuk menggunakan
--scope
opsi untuksystemd-run
menjalankan program di latar depan.sumber
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:
atau versi yang sudah usang:
Namun ini tidak sesuai dengan pertanyaan karena tidak dapat digunakan untuk proses yang sudah berjalan tetapi mungkin bermanfaat dalam beberapa kasus lain.
Tautan:
sumber