【问题排查】记一次ab压测出现错误的原因分析

在使用ab进行压力测试时,遇到并发不高但频繁出现Failedrequests的情况,深入分析发现是由于服务B所在的服务器TCP半连接队列丢包所致。本文详细介绍了问题的排查过程,包括如何定位到TCP层面的问题,以及如何通过调整服务器配置来解决这一问题。

阅读本文大概需要 3 分钟。

用ab压测服务A (服务A会调用服务B) 的时候,并发不大的情况下,经常出现Failed requests, 最终发现原因是服务B所在服务器tcp半连接队列丢包,导致部分tcp连接不成功,最终请求失败,这里还原下整个过程分析下 (以下将服务A所在服务器称为客户端,服务B所在服务为服务器端)

问题现象

ab 压测出现Failed requests

分析过程

1.客户端查看错误日志,看到错误原因

net/http: request canceled while waiting for connection

2.服务端根据客户端trace_id查找请求,日志里面找不到,怀疑是tcp层面的问题,也就是连接不成功,还没有进入应用层

3.服务器端查看tcp丢包情况,发现前后两次tcp半连接队列丢包个数相减正好是ab Failed requests个数3

# 查看半连接队列 (syns queue) 溢出 
netstat -s | grep drop
# 查看全连接队列 (accept queue) 溢出
netstat -s | grep TCPBacklogDrop

半连接队列丢包

4. 查看丢包原因,服务器端查看半连接队列(syns queue)大小,排除不是设置得过小的原因

cat /etc/sysctl.conf | grep net.ipv4.tcp_max_syn_backlog

TCP握手过程中建连接的流程和队列

5. 查看丢包的原因,通过查阅资料,服务器同时打开了tcp_timestamps + tcp_tw_recycle时,就会检查时间戳;如果对方发来的包的时间戳是乱跳的或者说时间戳是滞后的,这样服务器肯定不会回复,所以服务器就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求,于是丢掉客户端的syn请求不回复

解决办法

vim /etc/sysctl.conf 
修改 net.ipv4.tcp_tw_recycle = 0 或者 net.ipv4.tcp_timestamps = 0
然后sysctl -p 重启

参考

https://blog.youkuaiyun.com/pyxllq/article/details/80351827
https://blog.youkuaiyun.com/GV7lZB0y87u7C/article/details/79358193

蔡蔡技术记

<think>好的,用户问的是如何有效定位和分析现场故障原因。首先,我需要回想一下常见的调试手段有哪些。可能包括日志分析、断点调试、监控工具、单元试、代码审查等等。然后要分步骤解释,确保结构清晰。 用户可能是技术人员,比如开发人员或运维人员,他们遇到实际中的故障需要排查。所以需要实用的方法,而不仅仅是理论。可能需要从简单到复杂,逐步深入的方法。 首先,日志分析是基础,应该先检查系统日志查看错误信息。然后是监控工具,实时监控系统状态,比如CPU、内存使用情况。接下来是断点调试,逐步执行代码,查看变量状态。单元试和集成试可以验证模块功能是否正常。代码审查可能帮助发现潜在问题。还有网络抓包,检查通信是否正常。试模拟高负载情况,复现问题。版本回滚,确认是否是最近更改引起的问题。最后,工具辅助,比如使用调试器或性能分析工具。 需要确保每个步骤都解释清楚,为什么有效,以及具体怎么做。比如日志分析要关注时间戳和错误级别,监控工具要关注哪些指标。可能用户还需要知道如何结合多种方法,比如先用日志缩小范围,再用断点详细排查。 另外,用户可能希望了解实际案例,但问题中没有要求,所以可能不需要举例。但需要结构清晰,分点列出,每个手段的用途和操作方法。确保回答实用,步骤明确,帮助用户系统地进行故障排查。</think>现场故障定位与分析可遵循以下系统性调试手段(按优先级排序): 1. **日志追踪法** √ 查看系统日志(error/warning级别优先) √ 关注时间戳与故障发生时间段的关联日志 √ 使用grep/awk进行关键词过滤(示例:`grep "ERR" system.log | awk '$1 > "2023-08-01 14:00"'`) 2. **监控指标分析法** • 检查实时监控仪表盘(CPU/内存/磁盘IO/网络流量) • 对比历史同期数据(`prometheus --query='node_memory_usage{instance="10.0.0.1"}[24h]'`) • 定位指标突变点与故障时间线重合度 3. **断点调试技术** ```python # 在可疑代码段插入调试断点 import pdb; pdb.set_trace() # Python调试示例 watch variable_name # C/C++变量监控 ``` 4. **网络诊断组合拳** ├─ ping试基础连通性 ├─ traceroute检查路由路径 ├─ tcpdump抓包分析(`tcpdump -i eth0 port 80 -w capture.pcap`) └─ Wireshark图形化协议分析 5. **进程状态检** 使用top/htop查看资源占用排行 ```bash strace -p <PID> # 跟踪系统调用 lsof -p <PID> # 查看进程打开文件 ``` 6. **版本比对验证** ```diff - git checkout faulty_commit + git bisect start git bisect bad git bisect good v1.2 ``` 7. **试复现** ```shell # 使用ab进行并发ab -n 1000 -c 100 http://test.api/ # JMeter分布式 jmeter -n -t load_test.jmx -R 192.168.1.10,192.168.1.11 ``` 8. **环境隔离验证** 通过Docker创建纯净试环境: ```dockerfile FROM alpine:3.14 RUN apk add --no-cache python3 COPY test_script.py / CMD ["python3", "test_script.py"] ``` 9. **硬件诊断工具** • memtester内存检 • smartctl硬盘健康检查 • iperf3网络带宽试 10. **调用链分析(分布式系统)** 使用Jaeger/Zipkin进行全链路追踪: ``` jaeger-agent --collector.host-port=jaeger:14267 ``` 调试黄金法则:始终采用「假设-验证-排除」的闭环流程,每次验证后录排除项。建议配备标准化检查清单(Checklist),逐步缩小故障范围。复杂系统建议使用故障注入试(Chaos Engineering)提前暴露潜在问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值