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 ?
Respuestas:
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
FixedArray
yLinkedList
colas.fuente
/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!La respuesta a su primera pregunta es:
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:
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:
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:
Cuarto , opcional pero muy recomendable, también habilitaría marcas de tiempo de alta resolución:
Además, esta opción normalmente está desactivada de forma predeterminada (¿por qué en la Tierra?).
fuente