Jawaban:
Itu tentu bukan tugas sepele yang tidak bisa dilakukan di userspace. Untungnya, ini bisa dilakukan di Linux, menggunakan cgroup
mechanizm 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 blkio
set 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 limit1M
yang 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=direct
akan bekerja seperti yang diharapkan. cgroup v2 dapat menangani ini jika filesystem mendukungnya. Detail: Menggunakan cgroup untuk membatasi I / O
ionice
dari util-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:
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.
CFQ
penjadwal I / O. Banyak sistem modern memiliki deadline
satu 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 --scope
opsi untuk systemd-run
menjalankan 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_device
ls -l /dev/sda