La generación de rrdgraph falla en una alta carga de E / S

8

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: gráfico de carga de la CPU con líneas faltantes

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.

Dennis Nolte
fuente
1
Hace mucho tiempo cuando MRTG fue reemplazado por RRDgraph. Uno de los cambios maravillosos de lo antiguo a lo nuevo fue que RRDgraph en realidad genera las imágenes solo cuando hay una solicitud de visualización. El antiguo MRTG generaba gráficos completamente nuevos para cada punto de datos cada cinco minutos. Su problema es con la recopilación de datos, no con el procesamiento gráfico.
ericx
@ericx gracias por tu comentario. Agregué la fuente para la generación de datos. ¿Todavía cree que el problema es el comando vmstat en lugar de IOnice / nice que de alguna manera no funciona correctamente? Si es así, ¿por qué piensas de esa manera?
Dennis Nolte
¿Su croncaptura STDERR en alguna parte? En FreeBSD generalmente ejecuto estos periodic every5y tengo un /var/log/periodic.every5que 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 cricketque tenía su propio registro. Los cricketregistros 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.
ericx
este es el comando que se usó para crearlos inicialmente: create cpu.rrd --step 300 DS: sys: GAUGE: 70: U: U DS: user: GAUGE: 70: U: U RRA: AVERAGE: 0.01: 1: 6351 así que esto significa que acabas de encontrar otro error, gracias. Reescribí STDOUT y STDERR para ese script para probar, no se registró nada que me ayudó cuando intenté por primera vez. agregaré la salida mañana
Dennis Nolte
1
En términos de entender el "fallo", la pantalla de rrdtool se basa en un ciclo de sondeo de 5 minutos. Si no termina de procesar un ciclo antes de que comience el siguiente, y si su recopilación de datos y producción de gráficos es parte de la misma operación de procesamiento, obtendrá un punto de datos que falta.
mc0e

Respuestas:

2

Supongo que no es la herramienta rrdtool la que no puede actualizar el gráfico, sino que los datos no se pueden medir en este punto. Por cierto, su método para medir las estadísticas de CPU y memoria es simplemente incorrecto, ya que le da un resultado instantáneo. La carga de CPU y memoria puede cambiar drásticamente a lo largo del intervalo de 60 segundos, pero solo tomará un valor. Realmente debería considerar tomar datos SNMP, que proporcionan datos promedio en un intervalo. Además, toda la tubería parece ser más costosa y lenta que una llamada snmpget. Podría ser la principal razón de lagunas.

drogadicto
fuente
solo como seguimiento, fue esto. Una vez que pudimos mover algunos procesos hambrientos de recursos a otro servidor, los gráficos se generaron bien.
Dennis Nolte