Jawaban:
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.
dd ... oflag=directakan bekerja seperti yang diharapkan. cgroup v2 dapat menangani ini jika filesystem mendukungnya. Detail: Menggunakan cgroup untuk membatasi I / O
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.
CFQpenjadwal I / O. Banyak sistem modern memiliki deadlinesatu diaktifkan secara default.
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.
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:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicels -l /dev/sda