我有一台 openSUSE 13.1 VM(主机运行 Virtualbox 4.2.18,也在 openSUSE 13.1 上),重新启动 httpd(Apache/2.4.6)总是需要 1.5 分钟:
foobar:~ # time /etc/init.d/apache2 restart
redirecting to systemctl restart apache2.service
real 1m30.778s
user 0m0.004s
sys 0m0.000s
随后立即重启就正常了(非常快):
foobar:~ # time /etc/init.d/apache2 restart
redirecting to systemctl restart apache2.service
real 0m1.023s
user 0m0.004s
sys 0m0.000s
5 分钟后,重启时间再次变为恰好 90 秒:
foobar:/tmp # time /etc/init.d/apache2 restart
redirecting to systemctl restart apache2.service
real 1m30.684s
user 0m0.000s
sys 0m0.000s
我目前所寻找的是:
top
当 apache 重新启动时并没有显示太多信息(使用率约为 0%)。netstat
也没有表现出与外界的任何联系。
请注意,这是一个当前流量为 0 并且内存和磁盘中有大量可用 GB 的虚拟机。
我还发现“重新启动”中的“停止”部分需要 90 秒。
知道为什么会发生这种情况或我下一步应该去哪里查看吗?
编辑:我发现当stop
花费 90 秒时我会始终得到以下信息/var/log/apache2/error_log
:
[core:notice] [pid 3179] AH00052: child pid 3203 exit signal Segmentation fault (11)
答案1
经过多次尝试和错误,我发现这是由php5
正在加载的模块引起的/etc/sysconfig/apache2
。删除它可以完全停止此行为。
但是我需要该php5
模块,因此为了减轻这种延迟,我添加了以下内容etc/apache2/server-tuning.conf
:
GracefulShutdownTimeout 2
现在,当停止 apache 时发生段错误,它只会挂起 2 秒钟。
答案2
同样的事情发生在我身上,结果是我将 /etc/hosts 文件保留为默认设置。
在我更新主机文件之后,延迟立即消失,如下所示:
127.0.0.1 localhost
::1 localhost
172.16.333.444 www.mysite.com mysite.com
参考:
为多个域提供服务的单个 IP 服务器的 /etc/hosts 条目
https://unix.stackexchange.com/questions/57439/slow-start-of-midnight-commander#answer-397879
答案3
使用优雅重启时,父 Apache 进程会停止接受新连接,并永远等待所有子进程退出。因此,实际上 Web 服务器处于死机状态(现有连接除外),直到所有现有子进程退出。
在短时间 http/https 连接的正常使用情况下,正常关闭或重启时这不是问题……通常需要一秒钟。问题在于,当你有延迟子进程退出的东西时,例如持久的 websocket 连接。在这种情况下,服务器将永远无法正常停止/重启……它将永远处于半死状态。
您可以使用 GracefulShutdownTimeout 指令调整延迟:
https://httpd.apache.org/docs/2.4/mod/mpm_common.html#gracefulshutdowntimeout
默认情况下设置为 0(无限)。5 秒是一个更合理的值。
请注意,使用 systemctl 重启服务器时,默认情况下它最多只会等待 90 秒,然后强制其终止子进程(而不是永远),这就是您看到这 90 秒延迟的原因。这是在 /etc/systemd/system.conf 中设置的:
#DefaultTimeoutStopSec=90s
也可以使用 TimeoutStopSec 选项针对各个单元进行更改。