[Python] Automysqlbackup e py

Manlio Perillo manlio.perillo a gmail.com
Gio 24 Ott 2013 12:45:50 CEST


On 24/10/2013 12:33, Fabrizio Soppelsa wrote:
> [...]
>> Su sistema UNIX puoi provare a ridurre la priorità del tuo programma
>> con nice.  In aggiunta puoi mettere il processo in pausa dopo aver
>> letto/scritto un chunk di dati da/verso il disco.
>
> Grazie. Ho già provato con renice, ma da Munin vedo che non riesco a
> diminuire i picchi di I/O. Mentre non ho provato con il mettere il
> processo in pausa ogni tot di scritture, potrebbe essere un'idea.
> Perdona l'ignoranza mi dai un hint su come provare? :)
>

Se il problema è causato dall'utility di backup di MySQL, su cui non hai 
controllo, temo ci sia poco da fare, a meno di non fare cose strane a 
livello di librerie dinamiche.

Una soluzione possibile, su sistemi UNIX, è quello di fare scrivere il 
file di backup su una FIFO (mkfifo), e avere un processo Python che 
legga dall'altro lato della FIFO in modo da regolare l'I/O con la 
procedura che indico in seguito.


>> Ma il problema di prestazioni lo hai quando viene generato il file di
>> backup su file su disco dall'utility di backup di MySQL, oppure
>> durante l'esecuzione del tuo trigger scritto in Python?
>
> Soprattutto in generazione dei file di backup. Ma anche in fase
> "trigger" (sono banali .py che creano dei pid, chiamano utility di
> sistema ecc.) se i file sono pesanti. Per esempio cifro i file con gpg,
> oppure importo da remoto altri file...
>

Per codice sotto il tuo controllo hai più spazio di manovra.
Ad esempio per cifrare i file di backup puoi fare qualcosa dipo:

while True:
     buf = os.read(fdin, 8196)
     os.sleep(nice_pause)
     cbuf = do_crypt(buf)

Se il file criptato deve essere salvato sulla stessa macchina virtuale, 
allora puoi fare:

     zbuf = do_compress(cbuf)
     os.write(fdout, zbuf, len(zbuf)
     os.sleep(nice_pause)

altrimenti puoi inviare i dati tramite socket.

Nota la compressione: è molto importante per ridurre l'I/O.

Se chiami utility di sistema, devi fare attenzione che non facciano I/O 
eccessivo.

Nel caso in cui fai scrivere il file di backup su una FIFO, ed il file 
di backup originale (non criptato) non ti serve, risparmi molto I/O e 
sicuramente la procedura di backup avrà un impatto molto minore sul 
sistema; probabilmente anche se non fai os.sleep ad oggi lettura/scrittura.

Il tutto da verificare.


Ciao  Manlio


Maggiori informazioni sulla lista Python