registro asincrónico a través de rsyslogd (8) y aumento del búfer de escritura

10

En un sitio web de alto tráfico que se ejecuta en contenedores virtuales (VMware) y que carece de almacenamiento local, hemos logrado aumentar significativamente el rendimiento (solicitudes por segundo) al pasar del registro directamente a los archivos de registro (que residen en el almacenamiento de red remoto) a rsyslogd .

Esencialmente, hemos cambiado de registro síncrono a asíncrono. Los trabajadores del servidor web escriben usando syslog (3) en algún búfer de memoria y rsyslogd (8) envía los datos a un archivo real en paralelo y a su propio ritmo, para que los procesos no se bloqueen en IO al iniciar sesión.

Hasta ahora tan bueno. El problema es que ocasionalmente se impide que rsyslogd escriba (por ejemplo, una interrupción momentánea / prolongada de la red) y el búfer entrante se llena rápidamente.

Mis preguntas son:

  • ¿Puede un cliente bloquear al escribir en rsyslogd usando syslog (3) ?
  • ¿Hay alguna manera de ver las estadísticas de rsyslogd , por ejemplo, qué tan grande / lleno es el búfer?
  • ¿Hay alguna manera de aumentar el tamaño del búfer entrante rsyslogd ?
arielf
fuente
2
¿Alguna vez resolviste esto? Si es así, me interesaría leer tu respuesta.
djeikyb
1
@djeikyb: lo siento, no. Veo interés (votos sobre la pregunta) pero nadie la ha respondido todavía. Parece que esto requiere una inmersión en el código fuente.
arielf 01 de
1
No dice qué servidor web está utilizando. Tal vez no deberías estar usando syslog en absoluto. ¿Apache, por ejemplo, usa syslog para iniciar sesión o simplemente escribe en archivos de registro? Iniciar sesión en una base de datos es otra posibilidad.
Blujay

Respuestas:

1

Hasta donde recuerdo, el modo predeterminado para la cola de mensajes principal en rsyslog es una matriz de tamaño fijo. Tiene un límite para 10k elementos más o menos. Intente cambiar esto a la cola de la lista vinculada, debería manejar sus ráfagas de mensajes ocasionales mucho mejor.

Sí, hay FixedArrayy LinkedListcolas.

hostmaster
fuente
"Intenta cambiar" ... ¿Puedes ser más explícito? Mirando /etc/rsyslog.conf: no veo nada relacionado con los tipos de colas que mencionas. ¿Requiere esto un cambio de código? ¿Dónde y cómo se pueden configurar? ¡Gracias!
arielf
1

La respuesta a su primera pregunta es:

Sí, cualquier llamada a syslog () está bloqueando. Tal vez por un tiempo muy corto, pero sigue siendo una llamada sincrónica que involucra un descriptor de archivo. Ver man 3 syslogpara más detalles.

A menos que sus servidores usen arquitecturas asincrónicas y primitivas, siempre habrá algún bloqueo. Esto puede mitigarse, pero no eliminarse, por ejemplo, utilizando un hilo separado para iniciar sesión. Para las otras dos preguntas que realmente no sé, pero la única forma de saberlo es inspeccionar el código fuente rsyslogd (así como el de la familia de funciones syslog ()).

Más en general, si mueve el registro a un servidor externo a través del "protocolo de syslog de red" UDP: 514, entonces trae las posibilidades de crear bloqueos a casi cero. Con el inconveniente de la posible pérdida de algunos registros durante cargas altas.

Primero , en los servidores "de origen" debe asegurarse de que todo el registro se realice a través de syslog. Por ejemplo, en Apache2 necesita especificar:

ErrorLog "syslog:daemon"

Para otros servidores, consulte la página de manual correspondiente. Si no puede garantizar esto, tenga en cuenta que iniciar sesión en los sistemas de archivos puede crear

En segundo lugar , en la configuración de rsyslogd de origen, solicita dirigir todo el tráfico de syslog para la instalación que elija ("daemon" en este ejemplo) a uno o más servidores de syslog externos. En el archivo de configuración de rsyslog puede especificar:

daemon.* @192.168.128.1
daemon.* @192.168.254.1

tener dos copias de los registros que se enviarán a dos servidores diferentes al mismo tiempo.

En tercer lugar , en los servidores de destino, habilita la recepción del mensaje syslog a través de UDP: 514. Está en el archivo de configuración rsyslogd (destino) y normalmente está deshabilitado por defualt (sería suficiente para eliminar los números iniciales:

$ModLoad imudp
$UDPServerRun 514

Cuarto , opcional pero muy recomendable, también habilitaría marcas de tiempo de alta resolución:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

Además, esta opción normalmente está desactivada de forma predeterminada (¿por qué en la Tierra?).

EnzoR
fuente