Yanıtlar:
Bu kesinlikle kullanıcı alanında yapılamayan önemsiz bir iş değildir. Neyse ki, cgroupmekanizma ve onun blkio kontrolünü kullanarak Linux'ta yapmak mümkün .
Cgroup'u kurmak bir şekilde dağıtıma özgüdür, çünkü zaten monte edilmiş veya bir yerde bile kullanılabilir. Ancak, genel fikir (uygun çekirdek yapılandırmasına sahip olduğunuz varsayılarak):
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
Artık blkiodenetleyici ayarınız olduğu için onu kullanabilirsiniz:
mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y 1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device
Artık limit1Mbüyük / küçük sayıları X: Y ile 1 MB / sn arasında olan aygıtta yazma hızını sınırlayan bir grubunuz var . Gördüğünüz gibi, bu sınır cihaz başına. Şimdi yapmanız gereken tek şey bu grubun içine bir süreç koymak ve bunun sınırlı olması gerekiyor:
echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
Bunun diğer işletim sistemlerinde nasıl yapılıp yapılmadığını bilmiyorum.
dd ... oflag=directbeklendiği gibi çalışacaktır. Dosya sistemi destekliyorsa cgroup v2 bunu yapabilir . Ayrıntılar: G / Ç sınırlaması için cgroups kullanma
ionicedan util-linuxistediğini benzer bir şey yapar.
Mutlak IO limitleri koymaz, IO önceliği ve 'nezaket' belirler - nicebir proses için ne yaptığına benzer - CPU önceliği.
Man sayfasından:
ionice - G / Ç programlama sınıfını ve önceliğini ayarlayın veya alın AÇIKLAMA Bu program, G / Ç zamanlama sınıfını ve programı. Herhangi bir argüman veya sadece -p belirtilmezse, ionice sorguyu sorgular. Mevcut G / Ç programlama sınıfı ve bu işlem için öncelik. Komut verildiğinde, ionice bu komutu verilen komutla çalıştıracaktır. argümanlar. Sınıf belirtilmezse, komut çalıştırılır. "en iyi çaba" planlama sınıfına sahip. Varsayılan öncelik seviyesi 4'tür.
CFQG / Ç zamanlayıcısı ile çalıştığını akılda bulundurmalıdır . Birçok modern sistemde deadlinevarsayılan olarak bir tane etkindir.
systemd, grup tarafından manipüle edilen işlem çağrıları için bir sarıcı sağlar. Systemd run (1) kılavuz sayfasından:
Aşağıdaki komut, updatedb (8) aracını çağırır, ancak blok GÇ ağırlığını 10'a düşürür. BlockIOWeight = özelliği hakkında daha fazla bilgi için bkz. Systemd.resource-control (5).
systemd-run -p BlockIOWeight=10 updatedb
Programı ön planda çalıştırmak için bu --scopeseçeneği kullanmayı düşünün systemd-run.
Fche'nin cevabı çok iyi bir ipucudur, bunun için teşekkürler, sorunu gerçekten çözmese de, sorunun bir süreci belirli bir bant genişliği ile sınırlandırmasıydı.
Böyle bir şey öneriyorum:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
veya kullanımdan kaldırılmış sürüm:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
Yine de bu, soruya uymuyor çünkü halihazırda çalışan bir işlem için kullanılamıyor, ancak belki başka durumlarda yardımcı olabilir.
Bağlantılar:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_deviceile alt gruplar oluşturmak için cihaza genel politika belirlemelisiniz ve X ile Y'yi yanils -l /dev/sda