PHP CURL与命令行curl请求随机变慢,正常0.3s偶发超10秒如何解决
从你提供的curl_getinfo指标可以先定位到耗时异常的阶段:
慢请求中connect_time(TCP握手耗时)达1.5s,正常仅0.004s;pretransfer_time(SSL握手完成耗时)达6.8s,正常仅0.012s。且域名解析耗时正常,排除DNS问题;请求任意外部站点都可复现,排除后端服务问题,问题100%出在前端服务器本身的网络/系统配置层面。
排查步骤
1. TCP层问题排查
- 先验证网络链路丢包/抖动:使用tcp模式的mtr探测到目标IP的链路质量,执行命令
mtr --tcp --port 443 83.XXX.X.XXX连续发送100个包,观察是否有节点丢包率超过1%、或者延迟跳变超过1s的情况。 - 检查SYN丢包/队列溢出:执行
dmesg | grep -i tcp查看是否有syn flood、time wait bucket table overflow之类的报错;执行ss -lnt查看监听端口的Send-Q值,如果长期处于满额状态,说明TCP半连接/全连接队列溢出,会导致SYN包被丢弃,TCP默认1秒后才会重发SYN,直接导致握手耗时飙升。 - 验证MTU配置问题:部分中间链路会禁用PMTU探测,导致1500的默认MTU大包被丢弃触发重传,可临时修改网卡MTU为1400验证:
ifconfig 你的网卡名 mtu 1400,如果测试后慢请求消失,就把MTU配置永久写入网卡配置文件。
2. SSL层问题排查(大概率根因)
pretransfer_time 异常飙升99%的概率是系统熵池不足导致的:SSL握手需要读取随机数,当系统熵池耗尽时,读取/dev/random的操作会陷入阻塞,直到有足够的熵生成。
- 验证熵池状态:执行
cat /proc/sys/kernel/random/entropy_avail,如果返回值长期低于300,即可确认是熵不足问题。 - 修复方案:安装haveged服务补充熵池:
# Debian/Ubuntu apt update && apt install -y haveged systemctl enable --now haveged # CentOS/RHEL yum install -y haveged systemctl enable --now haveged
安装完成后再执行熵池查询命令,正常会回到1000以上,再测试curl请求即可看到耗时恢复正常。
3. 其他边界情况排查
- 检查出口防火墙/安全组规则:确认是否有对443端口的限流、随机丢包规则,可临时关闭防火墙测试对比。
- 检查系统代理配置:执行
echo $http_proxy $https_proxy确认是否配置了不稳定的代理服务,导致请求被转发后出现延迟。
内容的提问来源于stack exchange,提问作者Marco Heine
相关产品推荐
相关产品推荐

