NFsec Logo

Ustawienie zmiennej środowiskowej TZ oszczędza tysiące wywołań systemowych

26/02/2017 w Administracja, Debug Brak komentarzy.  (artykuł nr 593, ilość słów: 298)

A

by zaoszczędzić dodatkowych wywołań systemowych na serwerze przez chodzący proces – wystarczy ustawić zmienną środowiskową TZ na wartość: :/etc/localtime. Spowoduje to, że glibc nie będzie wykonywać zbędnych, dodatkowych wywołań systemowych. Szczególnie sprawdza się to w systemach, w których ustawienie strefy czasowej nie jest cyklicznie przestawiane – lub istnieje możliwość restartu danego procesu, kiedy to występuje (w większości przypadków taka zmiana występuje tylko raz – zazwyczaj w polskich realiach jest to przestawienie z UTC na CET).

Problem tkwi w funkcji localtime glibc. Za każdym wywołaniem tej funkcji sprawdzana jest zmienna środowiskowa TZ. Jeśli nie jest ona ustawiona (w Ubuntu 12.04, 14.04 oraz 16.04 nie jest) to za każdym wywołaniem localtime glibc wykona funkcję stat na pliku: /etc/localtime:

12:34:59.717987 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...}) 
12:34:59.718024 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718051 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718092 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718123 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718150 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718182 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718251 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})
12:34:59.718320 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2705, ...})

Wystarczy dodać np. do ścieżki /etc/profile.d/ plik tz.sh o zawartości:

export TZ=:/etc/localtime

i zrestartować program, aby glibc: zauważył, jaki plik z strefą czasową jest przeznaczony dla naszego programu; przeczytał i zakeszował go wewnętrznie tylko raz; nie wywoływał na nim więcej funkcji stat lub read dopóki zmienna środowiskowa TZ pozostanie bez zmian.

Jaki efekt ustawienie zmiennej TZ może mieć na działanie produkcyjnych systemów? Wszystko to zależy, jak często wybrane programy korzystają z wywołania localtime. Jeśli ustawiamy strefę czasową tylko raz podczas wstępnej instalacji lub konfiguracji systemu – warto ustawić zmienną TZ, aby wyeliminować te zbędne przełączanie kontekstu. Autor tego odkrycia potrafił zejść z 14,925 wywołań stat w ciągu 30 sekund do 8.

Więcej informacji: How setting the TZ environment variable avoids thousands of system calls

Kategorie K a t e g o r i e : Administracja, Debug

Tagi T a g i : , , , , , ,

Komentowanie tego wpisu jest zablokowane.