Почему так много звонков gettimeofday?

11

Почему комбинация PHP / Apache делает так много gettimeofdayсистемных вызовов? Даже если вы быстрые, каждый вызов - это вызов, который следует учитывать.

Просто быстро strace -c -p [apache2 process id], дает следующее:

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

Эти звонки по 20К волнуют меня. Кто-нибудь хочет пролить свет на это?

Gekkie
источник
Ява еще хуже ...
Нильс
Что делает ваша программа?
Майкл Хэмптон
1
Я не могу ответить «почему», но знаете ли вы о stackoverflow.com/questions/7266813/… и access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_MRG/… ? Системный вызов обычно отображается в коде пользовательского пространства («vsyscall»), поэтому накладные расходы будут значительно сокращены.
The Wabbit
1
Граф не должен беспокоить вас. Опрос имеет только 200 звонков, но он использует более 98% времени. Вы можете переключиться на нормальный вывод strace, и тогда вы увидите, что делает apache (это сильно замедлит работу).
ot--
3
Связанный: blog.packagecloud.io/eng/2017/03/08/…
Майкл Хэмптон

Ответы:

4

Gettimeofday чаще всего вызывается Apache для регистрации записей в файлах отладки. Также некоторые модули используют gettimeofday. Так что не о чем беспокоиться.

РЕДАКТИРОВАТЬ: Я сделал некоторые копания исходного кода PHP и пришел к следующим результатам: Большинство связанных с временем функций PHP будет использовать системное время. Так как они используют системное время, gettimeofday будет вызываться много, поэтому, если вы хотите уменьшить вызовы, уменьшите ваши функции, связанные со временем.

Я должен отметить, что другие функции также выполняют gettimeofday-вызовы. Например, если вы используете php_session_start, это (иногда, в зависимости от нескольких параметров, таких как, например, новый сеанс, ...) вызовет php_combined_lcg, который, в свою очередь, вызовет lcg_seed, если начальное значение не установлено в получить псевдослучайное число. И lcg_seed сделает вызов gettimeofday. Имейте это в виду.

timmeyh
источник
Но что, если мой PHP-скрипт CLI также выполняет много вызовов gettimeofday? что-то не так с моим php? (Т.е. date () или mktime () используют эти функции, если я не предоставляю метку времени в качестве параметра?)
Gekkie
Немного
обыскал
Спасибо ... Я думаю, мне просто нужно жить со всеми этими звонками. :)
Gekkie
Если вы xdebugустановили, это также может быть побочным продуктом.
B00MER
1

Я обнаружил, что включение php модуля xdebug заставляет strace сообщать о нескольких gettimeofdayвызовах.

Shoan
источник
1

Каждый процесс, которому требуется временная метка, вызывает gettimeofday, поэтому трудно понять, нормально это или нет.

Например, это может быть модуль, который создает журнал, модуль, который проверяет время ... Фактически, в вашем случае, чтобы узнать, почему существует так много gettimeofday, отключите модули apache, которые могут быть ответственны за вызов gettimeofday. Возможно, слишком много записей в многочисленные файлы журналов, расположенные в разных папках.

  • Отключите обычных подозреваемых, таких как mod_log_debug или mod_status
  • Перезагрузите конфигурацию Apache
  • Трассирование
Николя Геренет
источник