为什么有这么多的 gettimeofday 调用?

为什么有这么多的 gettimeofday 调用?

为什么 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

这 20K 个电话让我很担心。有人愿意解释一下吗?

答案1

Gettimeofday 主要是被 Apache 调用来记录调试文件中的条目。一些模块也使用 gettimeofday。所以不用担心。

编辑:我挖掘了一些 php 源代码,得出以下结果:大多数与时间相关的 php 函数将使用系统时间。由于它们使用系统时间,因此 gettimeofday 将被多次调用,因此如果您想减少调用次数,请减少与时间相关的函数。

不过,我必须指出,其他函数也会进行 gettimeofday 调用。例如,如果您使用 php_session_start,这将(有时,取决于一些参数,例如是否是新会话等)调用 php_combined_lcg,如果没有设置种子值来获取伪随机数,则 php_combined_lcg 会依次调用 lcg_seed。而 lcg_seed 将进行 gettimeofday 调用。请记住这一点。

答案2

我发现启用 php 模块 xdebug 会导致 strace 报告几个gettimeofday调用。

答案3

每个需要时间戳的进程都会调用 gettimeofday,因此很难知道它是否正常。

例如,它可以是创建日志的模块,检查时间的模块……事实上,就你的情况而言,要知道为什么有这么多 gettimeofday,请禁用可能负责调用 gettimeofday 的 apache 模块。可能对位于不同文件夹中的大量日志文件进行了太多写入。

  • 禁用常见的 mod_log_debug 或 mod_status 等
  • 重新加载 Apache 的配置
  • 斯特拉斯

相关内容