Pode syslog Desempenho pode ser melhorado?
Pergunta
Nós temos um aplicativo no Linux que utilizou a href="http://linux.die.net/man/3/syslog" rel="noreferrer"> syslog mecanismo . Depois de uma semana gasto tentando descobrir por que esta aplicação estava rodando mais lento do que o esperado, descobrimos que se eliminássemos syslog, e apenas escreveu diretamente para um arquivo de log, o desempenho melhorou dramaticamente.
Eu entendo porque syslog é mais lento do que escritas de ficheiros diretos. Mas eu queria saber: Existem maneiras de configurar o syslog para otimizar seu desempenho
?Solução
Você pode configurar o syslogd (e rsyslog pelo menos) não sincronizar os arquivos de log depois de uma mensagem de log, antecedendo um "-" para o caminho do arquivo de log no arquivo de configuração. Isso acelera o desempenho em detrimento do perigo que as mensagens de log podem ser perdidos em um acidente.
Outras dicas
Existem várias opções para melhorar o desempenho syslog:
-
Optimizar a chamadas com um macro
int LogMask = LOG_UPTO(LOG_WARNING); #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__) int main(int argc, char **argv) { LogMask = setlogmask(LOG_UPTO(LOG_WARNING)); ... }
Uma vantagem de usar uma macro para chamadas de filtro syslog é que toda a chamada é reduzido a um salto condicional em uma variável global, muito útil se acontecer de você ter chamadas de depuração que estão traduzindo grandes conjuntos de dados através de outras funções.
-
setlogmask ()
setlogmask(LOG_UPTO(LOG_LEVEL))
setlogmask () irá otimizar a chamada não log para / dev / log, mas o programa irá ainda chamar as funções usadas como argumentos.
-
filtragem com syslog.conf
*.err /var/log/messages
"veja a página de manual do syslog.conf para mais detalhes."
-
configure syslog para fazer o log assíncrono ou tamponada
metalog utilizada para armazenar temporariamente a saída do log e corou-lo em blocos. estoque syslog e syslog-ng não faça isso, tanto quanto eu sei.
Antes de embarcar no novo daemon escrita que você pode verificar se syslog-ng é mais rápido (ou pode ser configurado para ser mais rápido) do que simples syslog de idade.
Um truque que você pode usar se você controlar a origem para o aplicativo de registro é para mascarar o nível de registro que você quer no próprio aplicativo, em vez de no syslog.conf. Eu fiz isso anos atrás, com um aplicativo que gerou uma enorme enorme enorme quantidade de logs de depuração,,. Em vez de remover as chamadas a partir do código de produção, nós apenas mascarado modo que o nível de depuração nunca chama foi enviado para o daemon. Na verdade, eu encontrei o código, é Perl, mas é apenas uma fachada para o (3) chamada setlogmask.
use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through. If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1 = emerg
# 2 = alert
# 4 = crit
# 8 = err
# 16 = warning
# 32 = notice
# 64 = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");
Não sei por que eu usei decimal em vez de uma máscara de bits ... ombros
Escreva a sua própria implementação syslog. :-P
Isso pode ser feito de duas maneiras.
- Escreva a sua própria gancho
LD_PRELOAD
para substituir as funções de syslog, e torná-los saída parastderr
vez. Na verdade, eu escrevi um post sobre isso há muitos anos: http://marc.info/?m=97175526803720 :-P - Escreva seu próprio daemon syslog. É apenas uma simples questão de pegar datagramas fora do
/dev/log
! :-P
Ok, ok, assim que estas são as duas respostas brincalhões. Você já perfilado syslogd
para ver onde ele está bloqueando a maior parte?
Você pode configurar o nível do syslogd (ou instalação) para fazer logon de forma assíncrona, colocando um sinal de menos antes de caminho para arquivo de log (ie .: utilizador * [Tab] -. / Var / log / user.log).
Felicidades.
A implementação syslog-assíncrona () pode ajudar, correndo o risco de linhas de registo / atrasos delimitadas perdidos em outros momentos. http://thekelleys.org.uk/syslog-async/
Nota: 'assíncrona' aqui se refere a fila eventos de log dentro de sua aplicação, e não a opção de configuração de arquivo assíncrona saída syslogd que outras respostas consulte
.