
Redhat/CentOS e outras distribuições do Linux usam rsyslog em vez de syslog. No rsyslog versão 5, a limitação de taxa(ou rate-limit) das mensagens de log é habilitada por padrão. Além disso, systemd-journald impõe limitação de taxa no log.
A limitação de taxa evita que o log use níveis excessivos de recursos do sistema e inunde /var/log/message com mensagens desnecessárias. Para registrar um evento, ele precisa ser gravado no disco. Se houver muitos eventos repetitivos registrados no disco em um período de tempo específico, eles podem sobrecarregar um sistema e fazer com que serviços mais importantes respondam lentamente ou até mesmo uma falha inesperada. Portanto, desabilitar a limitação de frequência geralmente não é recomendado, mas algumas vezes pode ser necessário para fins de diagnóstico. Ao invés de desabilitar, tente aumentar o seu valor/limite.
Problema
O CentOS/RHEL geralmente usa o mecanismo de limite de taxa rsyslogd. Se esse limite é ultrapassado então mensagens de log no arquivo /var/log/messages do sistema se parecem com o exemplo a seguir:
Jul 30 03:29:45 hostname rsyslogd: imjournal: 102776 messages lost due to rate-limiting
ou ainda
messages lost due to rate-limiting (20000 allowed within 600 seconds)
O pior é que há supressão de registro, isto é, o sistema para por uns minutos de registrar os logs.
Solução
Se você instalou mais programas acabou gerando mais logs a serem gerenciados pelo rsyslog e systemd. Não é recomendado desabilitar o limite imposto por esses programas por razões que comendo mais adiante. Ao invés de desabilitar, podemos aumentar o limite. O padrão do rsyslog é de 20 mil registros dentro de 600 segundos.
Temos que alterar essas duas opções:
- Ratelimit.Interval=”600″
- Ratelimit.Burst=”20000″
elas não aparecem dentro de /etc/rsyslog.conf e isso significa que o rsyslog está usando os valores padrões dessas de cada uma. Você deverá digitá-las.
Acesse o arquivo /etc/rsyslog.conf e deixe-o assim:
#### MODULES #### module(load="imuxsock" # provides support for local system logging (e.g. via logger command) SysSock.Use="off") # Turn off message reception via local log socket; # local messages are retrieved through imjournal now. module(load="imjournal" # provides access to the systemd journal StateFile="imjournal.state" Ratelimit.Interval="300" Ratelimit.Burst="30000" ) # File to store the position in the journal #module(load="imklog") # reads kernel messages (the same are read from journald) #module(load="immark") # provides --MARK-- message capability
Por que diminuir o valor de 600 para 300 ao invés de aumentar? Isso é por conta da forma de como funciona o rsyslog. Na configuração padrão ele suporta o recebimento de 20 mil registros dentro de 10 minutos(ou 600 segundos). Se esse valor for alcançado então o rsyslog pára, espera terminar os 10 minutos e depois retorna a gravar os logs. Por exemplo, se o rsyslog recebeu 20 mil registros em 5 minutos ele ficará parado mais 5 minutos até completar os 10.
Diminuindo de 10 minutos para 5 dificilmente o rsyslog irá receber 20 mil registros dentro desse tempo e então ele não irá parar. É confuso num primeiro momento entender dessa forma mas é assim seu funcionamento.
Reinicie o serviço rsyslog
systemctl restart rsyslog.service
Sobre o módulo imjournal, ele é um módulo 🙂 que fornece a capacidade de importar mensagens de log estruturadas do systemd journal para o syslog.
Abaixo continuo com mais alguns detalhes que podem ser úteis para você. Mas, se preferir, pode parar por aqui.
Se o Problema “messages lost due to rate-limiting” Continuar
particularmente, sempre evito desativar essa opção de limitação dos logs. O que você pode fazer é ir ajustando o valor de Ratelimit.Interval=”600″ sempre para baixo, por exemplo, se 600 segundos não funcionou diminua para 500 e vai reinciando o rsyslod e analisando se houve interrupção(supressão) dos logs. Se houve, diminua ainda esse valor. Só evite desabilitá-lo colocando um zero.
Se estiver recebendo muitos logs, outros fatores deverão ser analisados. Veja se não tem algum processo ou programa gerando logs em excesso e sem necessidade.
Limite de Taxa do Systemd
Por padrão, o systemd permite 1.000 mensagens em um período de 30 segundos. Os limites são controlados no arquivo /etc/systemd/journald.conf.
RateLimitInterval=30s RateLimitBurst=1000
Se mais mensagens do que a quantidade especificada em RateLimitBurst forem recebidas dentro do tempo definido por RateLimitInterval, todas as outras mensagens dentro do intervalo serão descartadas até que o intervalo termine. Você pode modificar esses valores como achar melhor, você pode desabilitar completamente a limitação da taxa de registro de diário do systemd definindo ambos como 0.
Se você fizer qualquer alteração em /etc/systemd/journald.conf, precisará reiniciar o serviço systemd-journald para aplicar as alterações.
systemctl restart systemd-journald
Desabilitando o Limite de Taxa de Log
Não é recomendado fazer isso, mas aqui vai por sua conta em risco.
#1 Edite o arquivo “/etc/rsyslog.conf” e modifique os seguintes parâmetros abaio
de
$SystemLogRateLimitInterval 5 $SystemLogRateLimitBurst 30000
para
$SystemLogRateLimitInterval 0 $SystemLogRateLimitBurst 0
#2 Adicione o seguinte parâmetro após “$ModLoad imjournal” na seção “#### MODULES ####”
module(load="imjournal" ratelimit.interval="0")
Se quiser, ao invés de usar o comando acima, poderá usar o comando mais antiquado abaixo
$ImjournalRateLimitInterval 0
Ambos os parâmetros funcionam da mesma forma, a diferença é que a primeira linha é uma sintaxe antiga e a segunda é a nova sintaxe, que é a preferida.
#3 Edite o arquivo “/etc/systemd/journald.conf” e comente os seguintes parâmetros:
Mude os valores abaixo
RateLimitInterval=5s RateLimitBurst=30000
comentando-os para
#RateLimitInterval=5s #RateLimitBurst=30000
#4 reinicie o rsyslog e o journal
# systemctl restart systemd-journald # systemctl restart rsyslog