Abbiamo un sistema di produzione di CPU a 4 core che fa un sacco di cronjobs, con una coda di elaborazione costante e un carico normale di ~ 1,5.
Durante la notte facciamo alcune cose ad alta intensità di IO con Postgres. Generiamo un grafico che mostra l'utilizzo di carico / memoria (rrd-updates.sh) Questo "errore" a volte in situazioni di carico IO elevato. Succede quasi ogni notte, ma non in ogni situazione di I / O alta.
La mia soluzione "normale" sarebbe quella di rendere piacevole e ionizzare le cose di Postgres e aumentare il prio della generazione del grafico. Tuttavia, ciò non riesce ancora. La generazione del grafico è semi-thread-proof con flock. Registro i tempi di esecuzione e per la generazione del grafico è fino a 5 minuti durante un elevato carico di I / O, apparentemente con un grafico mancante per un massimo di 4 minuti.
Il tempo è esattamente corrispondente all'attività di postgres (questo a volte succede anche durante il giorno, anche se non così spesso) Ionicing fino a prio in tempo reale (C1 N6 graph_cron vs C2 N3 postgres), nicing molto al di sopra dei postgres (-5 graph_cron vs 10 postgres ) non ha risolto il problema.
Supponendo che i dati non vengano raccolti, il problema aggiuntivo è che ionice / nice in qualche modo non funziona ancora.
Anche con il 90% di IOwait e un carico di 100 ero ancora in grado di utilizzare il comando di generazione dei dati gratuitamente senza più di forse 5 secondi di ritardo (almeno sui test).
Purtroppo non sono stato in grado di riprodurlo esattamente durante i test (avendo solo un sistema di sviluppo virtualizzato)
versioni:
Kernel 2.6.32-5-686-bigmem
Debian Squeeze rrdtool 1.4.3
Hardware: HDD SAS 15K RPM con LVM in hardware
Opzioni di montaggio RAID1 : ext3 con rw, errori = remount-ro
Scheduler: CFQ
crontab:
* * * * * root flock -n /var/lock/rrd-updates.sh nice -n-1 ionice -c1 -n7 /opt/bin/rrd-updates.sh
Sembra che ci sia un BUG in qualche modo correlato da Mr Oetiker su github per rrdcache:
https://github.com/oetiker/rrdtool-1.x/issues/326
Questo in realtà potrebbe essere il mio problema (scritture simultanee) ma non spiega al cronjob di non fallire. Nell'ipotesi in realtà ho 2 scritture simultanee flock -n
restituirei il codice di uscita 1 (per pagina man, confermato in fase di test) Dato che non ricevo neanche un'e-mail con l'output e l'osservazione che il cronjob funziona davvero bene tutte le altre volte che lo sono in qualche modo perso.
Esempio di output:
Sulla base del commento ho aggiunto la fonte importante dello script di aggiornamento.
rrdtool update /var/rrd/cpu.rrd $(vmstat 5 2 | tail -n 1 | awk '{print "N:"$14":"$13}')
rrdtool update /var/rrd/mem.rrd $(free | grep Mem: | awk '{print "N:"$2":"$3":"$4}')
rrdtool update /var/rrd/mem_bfcach.rrd $(free | grep buffers/cache: | awk '{print "N:"$3+$4":"$3":"$4}')
Cosa mi manca o dove posso controllare ulteriormente?
Ricorda: sistema produttivo quindi nessun dev, nessun stacktrace o simile disponibile o installabile.
cron
cattura STDERR è ovunque? Su FreeBSD di solito li eseguo sotto periodic every5
e ho un /var/log/periodic.every5
che generalmente cattura eventuali errori. Vorrei anche scaglionare i tre script e possibilmente ruotare l'ordine per vedere se uno in particolare si blocca. La maggior parte della mia esperienza RRDTool è stata con cricket
cui ho avuto la propria registrazione. I cricket
registri erano eccellenti per trovare problemi. Stai davvero collezionando ogni minuto? (* * * * * invece di * / 5 * * * *) Qual è la granularità del grafico? RRD è impostato automaticamente su intervalli di 5 minuti.