Dlaczego tak wiele połączeń gettimeofday?

11

Dlaczego kombinacja PHP / Apache wykonuje tak wiele gettimeofdaywywołań systemowych? Mimo że są szybkie, każde połączenie jest połączeniem, które należy uwzględnić.

Po prostu strace -c -p [apache2 process id]daje:

Process 22294 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.52    0.010000          51       196           poll
  1.48    0.000150           0     20752           gettimeofday
  0.00    0.000000           0        94         7 read
  0.00    0.000000           0        48           write
  0.00    0.000000           0        96        32 open
  0.00    0.000000           0        75           close
  0.00    0.000000           0         6           chdir
  0.00    0.000000           0       766           time
  0.00    0.000000           0         2           chmod
  0.00    0.000000           0        56        10 access

Martwią mnie te połączenia za 20 tys. Czy ktoś chce rzucić na to trochę światła?

Gekkie
źródło
Java jest jeszcze gorsza ...
Nils,
Co robi twój program?
Michael Hampton
1
Nie mogę odpowiedzieć na pytanie „dlaczego”, ale czy wiesz o stackoverflow.com/questions/7266813/... i access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_MRG/… ? Syscall zwykle byłby mapowany na kod przestrzeni użytkownika („vsyscall”), więc narzut zostałby znacznie zmniejszony.
the-wabbit
1
Hrabia nie powinien cię martwić. Ankieta ma tylko 200 połączeń, ale wykorzystuje ponad 98% czasu. Możesz przełączyć się na normalne wyjście strace, wtedy zobaczysz, co robi apache (spowolni to znacznie).
ott--
3
Powiązane: blog.packagecloud.io/eng/2017/03/08/…
Michael Hampton

Odpowiedzi:

4

Gettimeofday jest najczęściej wywoływany przez Apache w celu rejestrowania wpisów w plikach debugowania. Również niektóre moduły używają gettimeofday. Więc nie ma się czym martwić.

EDYCJA: Wykonałem kopanie kodu źródłowego php i uzyskałem następujące wyniki: Większość funkcji php związanych z czasem będzie wykorzystywać czas systemowy. Ponieważ używają czasu systemowego, gettimeofday będzie często nazywany, więc jeśli chcesz ograniczyć połączenia, ogranicz funkcje związane z czasem.

Muszę jednak zauważyć, że inne funkcje również wykonują połączenia gettimeofday. Na przykład, jeśli użyjesz php_session_start, spowoduje to (czasami, w zależności od kilku parametrów, takich jak nowa sesja, ...) wywołanie php_combined_lcg, które z kolei wywoła wywołanie do lcg_seed, jeśli nie ma wartości początkowej ustawionej na uzyskać pseudolosową liczbę. I lcg_seed wykona połączenie gettimeofday. Pamiętaj o tym.

timmeyh
źródło
Ale co, jeśli mój skrypt php CLI ma również wiele wywołań gettimeofday? czy coś jest nie tak z moim php? (czy np. date () czy mktime () używają tych funkcji, jeśli nie
podam
Przeszukałem trochę i zredagowałem moją odpowiedź
timmeyh
Dzięki ... Chyba muszę żyć z tymi wszystkimi połączeniami. :)
Gekkie
Jeśli masz xdebugzainstalowany, może to być również jego produkt uboczny.
B00MER
1

Odkryłem, że włączenie modułu php, xdebug, powoduje, że strace zgłasza kilka gettimeofdaywywołań.

Shoan
źródło
1

Każdy proces, który wymaga znacznika czasu, wywołuje gettimeofday, więc trudno jest ustalić, czy jest to normalne, czy nie.

Na przykład może to być moduł, który tworzy dziennik, moduł sprawdzający czas ... W twoim przypadku, aby wiedzieć, dlaczego jest tak wiele gettimeofday, wyłącz moduły apache, które mogą być odpowiedzialne za wywołanie gettimeofday. Być może jest zbyt wiele zapisów do wielu plików dziennika znajdujących się w różnych folderach.

  • Wyłącz zwykłych podejrzanych, takich jak mod_log_debug lub mod_status
  • Załaduj ponownie konfigurację Apache
  • strace
Nicolas Guérinet
źródło