Come limitare l'accelerazione per I / O di processo a un limite massimo?


32

Sto cercando un modo per limitare un disco dei processi a un limite di velocità impostato. Idealmente, il programma dovrebbe funzionare in questo modo:

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

Limitazione del processo da 32423 a 1 megabyte al secondo di velocità di scrittura sul disco rigido.

Risposte:


33

Questo non è certamente un compito banale che non può essere svolto nello spazio utente. Fortunatamente, è possibile farlo su Linux, usando cgroupmeccanizm e il suo controller blkio .

L'impostazione di cgroup è in qualche modo specifica della distribuzione in quanto potrebbe essere già montata o addirittura utilizzata da qualche parte. Ecco un'idea generale, tuttavia (supponendo che abbiate una corretta configurazione del kernel):

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

Ora che hai blkioimpostato il controller, puoi usarlo:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

Ora hai un cgroup limit1Mche limita la velocità di scrittura sul dispositivo con numeri maggiori / minori da X: Y a 1 MB / s. Come puoi vedere, questo limite è per dispositivo. Tutto quello che devi fare ora è inserire un processo all'interno di quel gruppo e dovrebbe essere limitato:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

Non so se / come questo possa essere fatto su altri sistemi operativi.


3
Tieni presente che devi prima impostare la politica totale a livello di dispositivo per creare sottogruppi di ie echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicee ottieni X e Y di iels -l /dev/sda
dothebart

cgroup v1 non supporta il seguente writeback della cache. Ciò significa che testare un semplice comando dd che scrive su un file standard in un filesystem (piuttosto che su un dispositivo) probabilmente non mostrerà alcuna limitazione. Non utilizzare alcun writeback funzionerà: dd ... oflag=directfunzionerà come previsto. cgroup v2 può gestirlo se il filesystem lo supporta. Dettagli: Utilizzo dei cgroup per limitare l'I / O
AB

22

ionicedal util-linuxfa qualcosa di simile a quello che vuoi.

Non imposta limiti di I / O assoluti, imposta la priorità di I / O e la "gentilezza", in modo simile alla nicepriorità della CPU di un processo.

Dalla pagina man:

ionice - imposta o ottiene classe e priorità di pianificazione degli I / O di processo

DESCRIZIONE
Questo programma imposta o ottiene la classe di pianificazione I / O e la priorità per a
programma. Se non viene fornito alcun argomento o solo -p, ionice interrogherà il
classe di pianificazione I / O corrente e priorità per quel processo.

Quando viene dato il comando, ionice eseguirà questo comando con il dato
argomenti. Se non viene specificata alcuna classe, il comando verrà eseguito
con la classe di pianificazione "best-effort". Il livello di priorità predefinito è 4.

5
Bisogna tenere presente che funziona solo con uno CFQscheduler I / O. Molti sistemi moderni ne hanno deadlineuno abilitato per impostazione predefinita.
Highstaker,

8

systemd fornisce un wrapper per invocazioni di processi manipolate da cgroup. Dalla pagina man di systemd-run (1):

Il seguente comando richiama lo strumento updatedb (8), ma riduce il peso IO del blocco per esso a 10. Vedere systemd.resource-control (5) per ulteriori informazioni sulla proprietà BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb

Prendi in considerazione l'utilizzo --scopedell'opzione per systemd-runeseguire il programma in primo piano.


7

La risposta di Fche è un ottimo suggerimento, grazie per quello, anche se non risolve davvero il problema perché la domanda era limitare un processo a una larghezza di banda specifica.

Suggerirei qualcosa del genere:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

o la versione obsoleta:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

Tuttavia, questo non si adatta alla domanda perché non può essere utilizzato per un processo già in esecuzione, ma forse è utile in alcuni altri casi.

link:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.