为什么 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 的配置
- 斯特拉斯