İşlem G / Ç başına maksimum sınır değerine nasıl kısma verilir?


32

Bir işlem diskini ayarlanmış bir hız sınırıyla sınırlandırmanın bir yolunu arıyorum. İdeal olarak program buna benzer şekilde çalışır:

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

İşlemi 32423 ile 1 megabayt arasında bir saniye sabit sürücünün yazma hızı.

Yanıtlar:


33

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.


3
Unutmayın ki ilk önce ie 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
etmelisiniz

cgroup v1, önbelleğin geri yazılmasının ardından desteklemiyor. Bu, basit bir dd komut yazımının bir dosya sistemindeki standart bir dosyaya (bir cihaz yerine) test edilmesinin muhtemelen herhangi bir sınırlama getirmeyeceği anlamına gelir. Herhangi bir geri dönüş kullanmamak işe yarayacaktır: 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
AB

22

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.

5
Kişi sadece bir CFQG / Ç zamanlayıcısı ile çalıştığını akılda bulundurmalıdır . Birçok modern sistemde deadlinevarsayılan olarak bir tane etkindir.
Highstaker

8

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.


7

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:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.