Szukam sposobu ograniczenia dysku procesowego io do ustawionego ograniczenia prędkości. Idealnie program działałby podobnie do tego:
$ limitio --pid 32423 --write-limit 1M
Ograniczenie szybkości zapisu 32423 do 1 megabajta na sekundę.
Z pewnością nie jest to trywialne zadanie, którego nie można wykonać w przestrzeni użytkownika. Na szczęście można to zrobić w systemie Linux, używając cgroup
mechanizmu i jego kontrolera blkio .
Konfiguracja cgroup jest w jakiś sposób specyficzna dla dystrybucji, ponieważ może być już zamontowana, a nawet gdzieś używana. Oto ogólny pomysł (zakładając, że masz odpowiednią konfigurację jądra):
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
Teraz, gdy masz już blkio
ustawiony kontroler, możesz go używać:
mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y 1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device
Teraz masz grupę roboczą, limit1M
która ogranicza prędkość zapisu na urządzeniu z numerami głównymi / mniejszymi X: Y do 1 MB / s. Jak widać, limit ten dotyczy jednego urządzenia. Wszystko, co musisz teraz zrobić, to umieścić jakiś proces w tej grupie i powinno to być ograniczone:
echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
Nie wiem czy / jak można to zrobić w innych systemach operacyjnych.
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
I uzyskać X i Y, tj.ls -l /dev/sda
dd ... oflag=direct
będzie działać zgodnie z oczekiwaniami. cgroup v2 może to obsłużyć, jeśli system plików obsługuje to. Szczegóły: Korzystanie z cgroups w celu ograniczenia operacji we / wyionice
zutil-linux
robi coś podobnego do tego, czego chcesz.Nie określa bezwzględnych limitów We / Wy, ustawia priorytet IO i `` uprzejmość '' - podobnie jak co
nice
przypadku priorytetu procesora procesowego.Ze strony podręcznika:
źródło
CFQ
harmonogramem we / wy. Wiele nowoczesnych systemów madeadline
domyślnie włączony jeden.systemd zapewnia opakowanie dla wywoływanych przez cgroup wywołań procesów. Ze strony podręcznika systemd-run (1):
Rozważ skorzystanie z
--scope
opcji, abysystemd-run
uruchomić program na pierwszym planie.źródło
Odpowiedź fche jest bardzo dobrą wskazówką, dzięki za to, chociaż tak naprawdę nie rozwiązuje problemu, ponieważ pytaniem było ograniczenie procesu do określonej przepustowości.
Sugerowałbym coś takiego:
lub przestarzała wersja:
Nadal nie pasuje to do pytania, ponieważ nie można go użyć do już uruchomionego procesu, ale może jest pomocny w innych przypadkach.
Spinki do mankietów:
źródło