Jak ograniczyć przepustowość we / wy procesu do maksymalnego limitu?

32

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ę.

Sepero
źródło

Odpowiedzi:

33

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 cgroupmechanizmu 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ż blkioustawiony 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ą, limit1Mktó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.

Krzysztof Adamski
źródło
3
Należy pamiętać, że najpierw musisz ustawić politykę całkowitą dla całego urządzenia, aby utworzyć podgrupy, tj. echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_deviceI uzyskać X i Y, tj.ls -l /dev/sda
dothebart
cgroup v1 nie obsługuje śledzenia zwrotnego pamięci podręcznej. Oznacza to, że testowanie prostej komendy dd zapisującej do standardowego pliku w systemie plików (a nie na urządzeniu) prawdopodobnie nie będzie miało żadnych ograniczeń. Nieużywanie żadnego zapisu zwrotnego będzie działać: dd ... oflag=directbę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
AB
22

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.
cas
źródło
5
Należy pamiętać, że działa tylko z CFQharmonogramem we / wy. Wiele nowoczesnych systemów ma deadlinedomyślnie włączony jeden.
Highstaker
8

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 --scopeopcji, aby systemd-runuruchomić program na pierwszym planie.

fche
źródło
7

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:

Benibr
źródło