2008-10-16 9 views
9

Mamy aplikację na Linuksa, która używała mechanizmu syslog. Po tygodniu spędzonym na próbie ustalenia, dlaczego ta aplikacja działa wolniej niż oczekiwano, odkryliśmy, że jeśli wyeliminujemy syslog i właśnie zapisaliśmy bezpośrednio do pliku dziennika, wydajność znacznie się poprawiła.Czy wydajność syslog może być poprawiona?

Rozumiem, dlaczego syslog jest wolniejszy niż bezpośrednie zapisy plików. Ale zastanawiałem się: czy są sposoby na skonfigurowanie sysloga, aby zoptymalizować jego wydajność?

Odpowiedz

20

Można tak skonfigurować syslogd (i rsyslog), aby nie synchronizować plików dziennika po komunikacie, dodając znak "-" do ścieżki pliku dziennika w pliku konfiguracyjnym. Przyspiesza to wydajność kosztem niebezpieczeństwa, że ​​komunikaty dziennika mogą zostać utracone podczas awarii.

1

Napisz własną implementację syslog. :-P

Można tego dokonać na dwa sposoby.

  1. Napisz LD_PRELOAD hak zastąpić funkcji syslog, i uczynić z nich wyjście do stderr zamiast. Właściwie napisałem post o tym wiele lat temu: http://marc.info/?m=97175526803720 :-P
  2. Napisz własnego demona syslog. To tylko prosta sprawa pobrania datagramów z /dev/log! :-P

OK, okej, więc są to zarówno żartobliwe odpowiedzi. Czy profilowałeś syslogd, aby zobaczyć, gdzie najbardziej się dławi?

4

Przed rozpoczęciem pisania nowego demona możesz sprawdzić, czy numer syslog-ng jest szybszy (lub może być skonfigurowany jako szybszy) niż zwykły stary dziennik syslog.

+0

Istnieje również rsyslog. Nie wiem, czy jest szybszy, ale warto wypróbować. –

1

Możesz skonfigurować poziom (lub obiekt) syslogd, aby logować się asynchronicznie, wstawiając poprzednią ścieżkę do pliku logu (np .: użytkownik. * [Tab] -/var/log/user.log).

Pozdrawiam.

3

Jedną sztuczką, której możesz użyć, jeśli kontrolujesz źródło do aplikacji do rejestrowania, jest maskowanie poziomu dziennika, który chcesz, w samej aplikacji, zamiast w pliku syslog.conf. Zrobiłem to wiele lat temu dzięki aplikacji, która generowała ogromną, ogromną i ogromną ilość dzienników debugowania. Zamiast usuwać wywołania z kodu produkcyjnego, po prostu maskowaliśmy, aby wywołania na poziomie debugowania nigdy nie zostały wysłane do demona. Właściwie znalazłem kod, to Perl, ale to tylko front dla wywołania 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"); 

Nie wiem, dlaczego użyłem po przecinku zamiast maską bitową ... wzruszyć

+0

Nie jestem pewna, czy nazwałbym to sztuczką, tak powinieneś to zrobić, ale zgadzam się, że może nie jest tak powszechnie używana, jak powinna być. –

5

Istnieje kilka opcji, aby poprawić wydajność syslog:

  • Optymalizacja się rozmowy z makro

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

    Zaletą korzystania makro do filtrowania wywołań syslog polega na tym, że całe wywołanie jest zredukowane do warunkowego skoku zmiennej globalnej, co jest bardzo pomocne, jeśli zdarzy ci się, że masz wywołania DEBUG, które tłumaczą duże zestawy danych za pomocą innych funkcji.

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL)) 
    

    setlogmask() będzie optymalizować wezwanie nie zalogowaniu do/dev/log, ale program nadal będzie wywoływać funkcje używane jako argumenty.

  • filtrowanie syslog.conf

    *.err            /var/log/messages 
    

    "sprawdzić na stronie man syslog.conf do szczegółów."

  • Konfiguracja syslog zrobić asynchroniczny albo buforowe POZYSKUJĄCYCH

    metalog używany do bufor dziennika i przepłukuje się w blokach. stock syslog i syslog-ng nie rób tego, o ile wiem.

0

Implementacja syslog-async() może pomóc, na ryzyko utraconych linii dziennika/ograniczonych opóźnień w innym czasie. http://thekelleys.org.uk/syslog-async/

Uwaga: "asynchroniczny" odnosi się tutaj do zdarzeń dziennika w kolejce w aplikacji, a nie do asynchronicznej opcji konfiguracji pliku wyjściowego syslogd, do której odnoszą się inne odpowiedzi.

Powiązane problemy