Em um site de alto tráfego em execução em contêineres virtuais (VMware) e com falta de armazenamento local, conseguimos aumentar significativamente a taxa de transferência (solicitações por segundo), passando de fazer logon diretamente em arquivos de log (que residem no armazenamento de rede remoto) para rsyslogd .
Basicamente, passamos do log síncrono para o assíncrono. Os funcionários do servidor da Web gravam usando syslog (3) em algum buffer de memória e o rsyslogd (8) envia os dados para um arquivo real em paralelo e em seu próprio ritmo, para que os processos não bloqueiem o IO durante o logon.
Por enquanto, tudo bem. O problema é que ocasionalmente o rsyslogd é impedido de gravar (por exemplo, uma interrupção momentânea / prolongada da rede) e o buffer de entrada é preenchido rapidamente.
Minhas perguntas são:
- Um cliente pode bloquear ao gravar no rsyslogd usando o syslog (3) ?
- Existe uma maneira de analisar as estatísticas do rsyslogd , por exemplo, qual é o tamanho do buffer?
- Existe uma maneira de aumentar o tamanho do buffer de entrada rsyslogd ?
Respostas:
Tanto quanto me lembro, o modo padrão para a fila principal de mensagens no rsyslog é uma matriz de tamanho fixo. Ele tem um limite para 10 mil elementos ou mais. Tente mudar isso para a fila da lista vinculada, pois ele deve lidar com suas explosões ocasionais de mensagens muito melhor.
Sim, existem
FixedArray
eLinkedList
filas.fonte
/etc/rsyslog.conf
: Não vejo nada relacionado aos tipos de filas que você menciona. Isso requer uma alteração de código? Onde e como eles podem ser configurados? Obrigado!A resposta para sua primeira pergunta é:
A menos que seus servidores usem arquiteturas assíncronas e primitivas, sempre haverá algum bloqueio. Isso pode ser mitigado, mas não eliminado, por exemplo, usando um thread separado para o log. Para as outras duas perguntas que eu realmente não sei, mas a inspeção no código-fonte rsyslogd (assim como no da família de funções syslog ()) é a única maneira de saber.
Em geral, se você mover o log para um servidor externo por meio do "protocolo de syslog de rede" UDP: 514, trará a possibilidade de criar bloqueios quase zero. Com a desvantagem de possível perda de alguns registros durante altas cargas.
Primeiro , nos servidores "de origem", você precisa garantir que todo o log ocorra via syslog. Por exemplo, no Apache2, você precisa especificar:
Para outros servidores, consulte a página de manual apropriada. Se você não conseguir garantir isso, lembre-se de que o logon em sistemas de arquivos pode criar
Segundo , na configuração original do rsyslogd, você pede para direcionar todo o tráfego do syslog para o recurso que você escolher ("daemon" neste exemplo) para um ou mais servidores syslog externos. No arquivo de configuração rsyslog, você pode especificar:
ter duas cópias dos logs a serem enviadas para dois servidores diferentes ao mesmo tempo.
Terceiro , no (s) servidor (es) de destino, você ativa a recepção da mensagem syslog pelo UDP: 514. Ele está no arquivo de configuração rsyslogd (de destino) e normalmente é desabilitado por defualt (seria o suficiente para remover os #s principais:
Quarto , opcional, mas altamente recomendado, eu também habilitaria carimbos de data / hora de alta resolução:
Além disso, esta opção normalmente está desativada por padrão (por que na Terra?).
fonte