2008-10-16 2 views
9

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

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

ответ

20

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

1

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

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

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

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

4

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

+0

Существует также rsyslog. Не знаю, быстрее ли это, но, возможно, стоит попробовать. – 2008-10-16 11:15:07

1

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

Cheers.

3

Один трюк, который вы можете использовать, если вы контролируете источник в приложении регистрации, заключается в том, чтобы замаскировать уровень журнала, который вы хотите в самом приложении, а не в 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"); 

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

+0

Я не уверен, что я назвал бы это трюк, так как вы должны это делать, но я согласен, что это, возможно, не так широко используется, как должно быть. – 2008-10-16 12:35:11

5

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

  • Оптимизации из вызовов с помощью макроса

    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 состоит в том, что весь вызов равен , приведенному к условному переходу на глобальную переменную, очень полезно, если вы столкнулись с , имеют вызовы DEBUG, которые переводят большие наборы данных с помощью других функций.

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL)) 
    

    setlogmask() будет оптимизировать вызов не войдя в/DEV/войти, но программа будет до сих пор называют функции, используемые в качестве аргументов.

  • фильтрации с syslog.conf

    *.err            /var/log/messages 
    

    "проверить страницу человека для syslog.conf для деталей."

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

    Metalog, используемый для буфера вывода и войти продувают его в блоках. фондовый syslog и syslog-ng не делайте этого, насколько я знаю.

0

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

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