Odpowiedzi:
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.
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 / wy
ionice
z util-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:
ionice - ustaw lub uzyskaj klasę i priorytet planowania we / wy procesu OPIS Ten program ustawia lub pobiera klasę I / O szeregowania i priorytet dla program. Jeśli nie podano żadnych argumentów lub podano tylko -p, ionice wyśle zapytanie bieżąca klasa planowania we / wy i priorytet dla tego procesu. Po wydaniu polecenia, jonice uruchomi to polecenie z podanym argumenty. Jeśli nie zostanie podana żadna klasa, polecenie zostanie wykonane z klasą planowania „dołożenia wszelkich starań”. Domyślny poziom priorytetu to 4.
CFQ
harmonogramem we / wy. Wiele nowoczesnych systemów ma deadline
domyślnie włączony jeden.
systemd zapewnia opakowanie dla wywoływanych przez cgroup wywołań procesów. Ze strony podręcznika systemd-run (1):
Następujące polecenie wywołuje narzędzie updatedb (8), ale obniża dla niego wagę bloku IO do 10. Zobacz systemd.resource-control (5), aby uzyskać więcej informacji na temat właściwości BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb
Rozważ skorzystanie z --scope
opcji, aby systemd-run
uruchomić program na pierwszym planie.
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:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
lub przestarzała wersja:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
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:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
I uzyskać X i Y, tj.ls -l /dev/sda