Можно ли улучшить производительность системного журнала?

StackOverflow https://stackoverflow.com/questions/208098

  •  03-07-2019
  •  | 
  •  

Вопрос

У нас есть приложение в Linux, которое использовало системный журнал механизм.После недели, потраченной на то, чтобы выяснить, почему это приложение работает медленнее, чем ожидалось, мы обнаружили, что если мы устраним системный журнал и просто запишем его непосредственно в файл журнала, производительность значительно улучшится.

Я понимаю, почему системный журнал медленнее, чем прямая запись в файл.Но мне было интересно:Есть ли способы настроить системный журнал для оптимизации его производительности?

Это было полезно?

Решение

Вы можете настроить syslogd (и, по крайней мере, rsyslog) так, чтобы он не синхронизировал файлы журнала после сообщения журнала, добавив «-» к пути к файлу журнала в файле конфигурации.Это повышает производительность за счет опасности потери сообщений журнала в случае сбоя.

Другие советы

Существует несколько вариантов повышения производительности системного журнала:

  • Оптимизация исходящих звонков с помощью макроса

     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));
              ...
     }
    

    Преимущество использования макроса для фильтрации звонков Syslog состоит в том, что весь вызов уменьшается до условного прыжка на глобальную переменную, очень полезно, если у вас есть вызовы отладки, которые переводят большие наборы данных с помощью других функций.

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    SetLogMask () оптимизирует вызов, не вводя в систему в /dev /log, но программа все равно будет вызывать функции, используемые в качестве аргументов.

  • фильтрация с помощью syslog.conf

     *.err                                               /var/log/messages
    

    «Подробности см. на странице руководства syslog.conf».

  • настроить системный журнал для ведения асинхронного или буферизованного журналирования

    Metalog используется для буферизации вывода журнала и его очистки блоками.Стоковой системный журнал и Syslog-NG не делают этого, насколько я знаю.

Прежде чем приступить к написанию нового демона, вы можете проверить, системный журнал-ng работает быстрее (или может быть настроен так, чтобы работать быстрее), чем старый добрый системный журнал.

Если вы контролируете источник приложения для ведения журналов, вы можете использовать один трюк — замаскировать желаемый уровень журнала в самом приложении, а не в syslog.conf.Я сделал это много лет назад с приложением, которое создавало огромное, огромное, огромное количество журналов отладки.Вместо того, чтобы удалять вызовы из рабочего кода, мы просто замаскировали их, чтобы вызовы уровня отладки никогда не отправлялись демону.Я действительно нашел код, это Perl, но это всего лишь передняя часть вызова setlogmask(3).

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");

Не знаю, почему я использовал десятичную дробь вместо битовой маски... пожать плечами

Напишите свою собственную реализацию системного журнала.:-П

Этого можно добиться двумя способами.

  1. Напишите свой собственный LD_PRELOAD перехватчик для переопределения функций системного журнала и вывода их на stderr вместо.На самом деле я написал об этом пост много лет назад: http://marc.info/?m=97175526803720 :-П
  2. Напишите свой собственный демон системного журнала.Это просто вопрос извлечения датаграмм из /dev/log!:-П

Ладно-ладно, это оба шутливые ответы.Вы профилировали syslogd посмотреть, где оно больше всего задыхается?

Вы можете настроить уровень (или средство) syslogd для асинхронного ведения журнала, поставив минус перед путем к файлу журнала (т. е.:user.* [tab] -/var/log/user.log).

Ваше здоровье.

Реализация syslog-async() может помочь, но в других случаях существует риск потери строк журнала/ограниченных задержек.http://thekelleys.org.uk/syslog-async/

Примечание:«асинхронный» здесь относится к организации очереди событий журнала в вашем приложении, а не к параметру конфигурации асинхронного выходного файла syslogd, на который ссылаются другие ответы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top