Tenemos un sistema de producción de CPU de 4 núcleos que hace muchos cronjobs, con una cola de proceso constante y una carga habitual de ~ 1.5.
Durante la noche hacemos algunas cosas intensivas de IO con postgres. Generamos un gráfico que muestra el uso de carga / memoria (rrd-updates.sh) Esto "falla" a veces en situaciones de alta carga de E / S. Está sucediendo casi todas las noches, pero no en todas las situaciones de alta IO.
Mi solución "normal" sería agradable e ionizar las cosas de postgres y aumentar el prio de la generación de gráficos. Sin embargo, esto todavía falla. La generación de gráficos es a prueba de subprocesos con flock. Sí registro los tiempos de ejecución y para la generación del gráfico es de hasta 5 minutos durante una carga de E / S alta, lo que aparentemente resulta en un gráfico faltante de hasta 4 minutos.
El período de tiempo coincide exactamente con la actividad de postgres (esto a veces también ocurre durante el día, aunque no con tanta frecuencia). ) no resolvió el problema.
Suponiendo que los datos no se recopilan, el problema adicional es que el ionice / nice de alguna manera todavía no funciona.
Incluso con un 90% de IOwait y una carga de 100, todavía podía usar el comando de generación de datos sin demora de más de 5 segundos (al menos en las pruebas).
Lamentablemente, no he podido reproducir esto exactamente en las pruebas (solo tengo un sistema de desarrollo virtualizado)
Versiones
Kernel 2.6.32-5-686-bigmem
Debian Squeeze rrdtool 1.4.3
Hardware: SAS 15K RPM HDD con LVM en hardware
Opciones de montaje RAID1 : ext3 con rw, errores = remount-ro
Programador: CFQ
crontab:
* * * * * root flock -n /var/lock/rrd-updates.sh nice -n-1 ionice -c1 -n7 /opt/bin/rrd-updates.sh
Parece que hay un error posiblemente relacionado del Sr. Oetiker en github para rrdcache:
https://github.com/oetiker/rrdtool-1.x/issues/326
Esto en realidad podría ser mi problema (escrituras concurrentes) pero no explica que el cronjob no falle. En el supuesto de que realmente tengo 2 escrituras simultáneas flock -n
, devolvería el código de salida 1 (por página de manual, confirmado en las pruebas) Como tampoco recibo un correo electrónico con la salida y la observación de que el cronjob realmente funciona bien todo el tiempo que estoy de alguna manera perdido.
Salida de ejemplo:
Según el comentario, agregué la fuente importante del script de actualización.
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}')
¿Qué extraño o dónde puedo consultar más?
Recuerde: sistema productivo, por lo que no hay desarrolladores, ni stacktrace o similares disponibles o instalables.
cron
captura STDERR en alguna parte? En FreeBSD generalmente ejecuto estos periodic every5
y tengo un /var/log/periodic.every5
que generalmente captura cualquier error. También escalonaría los tres guiones y posiblemente rotaría el orden para ver si uno en particular se cuelga. La mayor parte de mi experiencia RRDTool fue con la cricket
que tenía su propio registro. Los cricket
registros fueron excelentes para encontrar problemas. ¿Realmente estás recolectando cada minuto? (* * * * * en lugar de * / 5 * * * *) ¿Cuál es la granularidad del gráfico? RRD tiene por defecto intervalos de 5 minutos.