Come impedire la rimozione di sottostruttura (`rm -rf`) dalla fame di altri processi per l'I / O su disco?


8

Abbiamo una directory cache Nginx molto grande (multi-GB) per un sito occupato, che occasionalmente dobbiamo cancellare tutto in una volta. Ho risolto questo problema in passato spostando la cartella cache in un nuovo percorso, creando una nuova cartella cache nel vecchio percorso e quindi rm -rfinserendo la vecchia cartella cache.

Ultimamente, tuttavia, quando ho bisogno di svuotare la cache in una mattinata intensa, l'I / O rm -rfsta facendo morire di fame i processi del mio server di accesso al disco, poiché sia ​​Nginx che il server per cui sono frontali sono ad alta intensità di lettura. Posso vedere il carico medio salire mentre le CPU rimangono inattive e rm -rfassorbono il 98-99% di Disk IO iotop.

Ho provato a ionice -c 3invocare rm, ma sembra non avere alcun effetto apprezzabile sul comportamento osservato.

C'è un modo per domare rm -rfper condividere di più il disco? Devo usare una tecnica diversa che prenderà spunto da ionice?

Aggiornare:

Il filesystem in questione è un archivio di istanze AWS EC2 (il disco principale è EBS). La /etc/fstabvoce è simile alla seguente:

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2

Probabilmente dovresti anche menzionare il filesystem che stai usando e come (opzioni di mount).
Cristian Ciupitu,

Aggiornato. Inoltre, nel caso in cui sia importante, questo è su Ubuntu 12.04.
David Eyk,

Nota che le prestazioni di IO su Amazon EBS possono essere piuttosto negative. Vedi perfcap.blogspot.com/2011/03/… che raccomanda un massimo a lungo termine di 100 iop, con scoppi a breve termine (1 minuto) fino a 1000. Sembra che il tuo caso sia molto più alto di quello in un minuto, da qui il problema.
Moshe Katz,

Bene, ecco perché stiamo usando un archivio di istanze, non EBS, per la cache. Vedi il mio commento di aggiornamento. Scusa se non era chiaro.
David Eyk,

Scusa, sono in ritardo, ma potresti indagare su cgroups e sul controller blkio
AndreasM

Risposte:


3

Tutti i dati raccolti da questa pagina. Di seguito sono riportate alcune opzioni per eliminare una grande directory di file. Controlla il writeup per i dettagli di come è stato prodotto.

Comando Tempo di sistema trascorso% CPU cs1 * (Vol / Invol)
rsync -a –elimina vuoto / a 10.60 1.31 95% 106/22
trova b / tipo f-elimina 28,51 14,46 52% 14849/11
trova c / tipo f | xargs -L 100 rm 41.69 20.60 54% 37048/15074
trova d / tipo f | xargs -L 100 -P 100 rm 34.32 27.82 89% 929897/21720
rm -rf f 31.29 14.80 47% 15134/11

* cs1 è switch di contesto volontario e involontario


Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Tom O'Connor,

Affascinante! Lo proverò.
David Eyk,

rsyncsta correndo proprio ora. Forse è troppo presto per dirlo e potrebbe essere aiutato che non lo sto eseguendo nel mezzo di una mattinata intensa, ma il server è ancora reattivo e la media del carico è gestibile.
David Eyk,

L'invocazione esatta che sto usando:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk,

Bene, ci sono volute solo 4 ore. ;) Accetterò questa risposta (mi dispiace @aferber) poiché mi piace la semplice chiamata e sembra essere suscettibile nicee ionice, o almeno non ha distrutto il server come ha rm -rffatto.
David Eyk,

9

La rimozione di file esegue solo operazioni di metadati sul filesystem, che non sono influenzate da ionice.

Il modo più semplice sarebbe, se non è necessario lo spazio su disco in questo momento, eseguire le rmore non di punta.

Il modo più complesso in cui POTREBBE lavorare è diffondere le cancellazioni nel tempo. Puoi provare qualcosa di simile al seguente (nota che presuppone che i percorsi e i nomi dei file NON contengano spazi!):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

Si noti inoltre che non è possibile utilizzare rm -fnel primo comando perché il ciclo non si arresterebbe (dipende dal codice di uscita dell'errore di rmquando non vi sono argomenti).

Puoi modificarlo modificando il numero di eliminazioni per ciclo (100 nell'esempio) e la durata del sonno. Tuttavia, potrebbe non funzionare davvero poiché il filesystem potrebbe ancora raggruppare gli aggiornamenti dei metadati in modo da creare problemi con il carico di I / O. Devi solo provare.


La rimozione di molti file richiede molto tempo, quindi non esiste un periodo "non di punta" che lo includa. :(
David Eyk,

Il whileloop sembra fare il trucco quando head -n 50. 100 stava ancora aumentando lentamente la media del carico al di sopra della soglia critica, il che mi dice che era in corso troppa contesa di risorse.
David Eyk,

Amico, ci vuole molto tempo per correre!
David Eyk,

La ricerca continuerà a elencare tutti i file nella directory e tutte le sottodirectory per ogni iterazione del ciclo while. Probabilmente potresti fare di meglio con qualcosa del genere
Randy Orrison,

1
La ricerca continuerà a elencare tutti i file nella directory e tutte le sottodirectory per ogni iterazione del ciclo while. Probabilmente potresti fare di meglio con qualcosa come find dir -type f -print0 | xargs -l50 -0 rmwait dove rmwait è uno script che esegue rm "$ @"; sleep 2. Nota l'uso di -print0 e -0 per gestire i nomi di file con spazi. -l50 dice a xargs di fare solo 50 alla volta.
Randy Orrison,

-1

Puoi abbinarlo al comando "simpatico". ionice -c 3 nice -19 rm -rf /some/folder

Ciò modifica la priorità del processo sulla macchina.


Sfortunatamente, nicesembra avere circa lo stesso effetto ionice, cioè nulla di apprezzabile.
David Eyk,

@DavidEyk. Se il bello e lo ionice non hanno un effetto "evidente", significa che nient'altro sta contendendo risorse in modo apprezzabile, o semplicemente non si nota l'effetto a occhio nudo. Dovresti davvero confrontarlo con iostat e vmstat per vedere l'effetto reale.
Michael Martinez,

Credo che @aferber abbia affrontato questo problema nella sua risposta: "La rimozione di file esegue solo operazioni di metadati sul filesystem, che non sono influenzate da ionice". Ho visto la contesa: i miei processi del server stavano morendo di fame per il tempo di lettura mentre la CPU si muoveva con il rm -rf99% iotop.
David Eyk,
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.