您好,目前我在 Ubuntu 服务器 16.04 上的 HTTPS 上遇到了 apache 2.4.18 随机缓慢的情况。以下是观察结果、症状和信息:
- HTTP 不会发生这种情况
- 当 Apache 的已用插槽数达到 2k 左右时,这种情况不会发生
/server-status
。当插槽数达到 2.7k 以上时,这种情况就会发生(我甚至看到过插槽数达到 4.2k 的情况) time curl -vI <url>
卡住Trying <ip address>
并在 1 到 30 秒内响应(平均处理时间为 0.2 秒,速度不慢时)。卡住时,tcpdump -n | grep '<ip address of request>'
服务器中没有传入数据包:一旦 curl 启动,它们就会出现- apache 使用 mpm_prefork 并采用以下设置
StartServers 10
MinSpareServers 50
MaxSpareServers 100
ServerLimit 20000
MaxRequestWorkers 20000
MaxConnectionsPerChild 0
- apache 的
/server-status
页面显示了许多(数百个)空闲插槽 - 服务器资源平均使用率:cpu 30%,负载平均 20,ram 使用 35%,磁盘 io r/w 非常低
- 对 TCP 队列进行一些调整尝试(https://blog.cloudflare.com/syn-packet-handling-in-the-wild/)
ss -n state syn-recv sport = :443 | wc -l
curl
重复启动时显示最大数量为 130。当这个数字接近 130 时,似乎会挂起net.core.somaxconn
是 128,我确实用 将其设置为 4096sysctl -w net.core.somaxconn=4096
,然后重新加载了 apache- 我已经启动
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
ss -plnt sport = :443
显示类似
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::443 :::* users:(("apache2",pid=184902,fd=8),<4000 more apache processes>
老实说,我不知道队列调整是否有效。
我想首先找出如何解决问题,找出导致速度缓慢的部分,因此任何有关故障排除的提示都非常感谢。谢谢
编辑1
好吧,有一件事我可能没有尝试(为了避免生产停机):重新启动 Apache。我以为端口 443 的 TCP 队列是由系统处理的独自的,即不询问 Apache 它的限制是多少:错误的重启之后,队列终于可以自由地超过 130:事实上,在 apache 重启后的最初几秒内,队列就达到了 apache 的限制 511。
现在队列看起来没问题了,curl 不再卡住了Trying to connect
;现在问题似乎出在 apache 方面,它即使在 HTTP 上看起来也很慢。
更多信息:
- 我使用的请求 URL 由 apache VirtualHost 处理,它只发出一个
Redirect
- 以下是有关 SSL 缓存的信息
SSL/TLS Session Cache Status:
cache type: SHMCB, shared memory: 512000 bytes, current entries: 2176
subcaches: 32, indexes per subcache: 88
time left on oldest entries' objects: avg: 229 seconds, (range: 209...247)
index usage: 77%, cache usage: 99%
total entries stored since starting: 43916
total entries replaced since starting: 0
total entries expired since starting: 0
total (pre-expiry) entries scrolled out of the cache: 41740
total retrieves since starting: 586 hit, 83648 miss
total removes since starting: 0 hit, 0 miss
因此,请分享关于如何解决缓慢问题的任何想法。谢谢