附录B:排错决策树
网络问题排查流程
1. 完全不通
1.1 ping不通
ping不通
├── 检查IP配置
│ ├── ip addr show
│ ├── 确认IP地址正确
│ └── 确认子网掩码正确
├── 检查路由
│ ├── ip route show
│ ├── 确认默认路由
│ └── 确认静态路由
├── 检查防火墙
│ ├── iptables -L -n
│ ├── 检查INPUT链
│ └── 检查FORWARD链
└── 检查链路
├── 网线连接
├── 网卡状态
└── 交换机状态
1.2 ping通但端口不通
端口不通
├── 检查服务监听
│ ├── ss -tuln | grep 端口
│ ├── netstat -tuln | grep 端口
│ └── 确认服务启动
├── 检查防火墙端口
│ ├── iptables -L -n | grep 端口
│ ├── 检查INPUT链
│ └── 检查FORWARD链
└── 检查NetworkPolicy
├── kubectl get networkpolicies
├── 检查策略规则
└── 确认允许访问
2. 间歇性不通
2.1 连接数问题
连接数问题
├── 检查连接数上限
│ ├── ss -s
│ ├── cat /proc/sys/net/core/somaxconn
│ └── 检查应用配置
├── 检查conntrack表
│ ├── sudo conntrack -S
│ ├── cat /proc/sys/net/nf_conntrack_max
│ └── 检查表是否满
└── 检查端口范围
├── cat /proc/sys/net/ipv4/ip_local_port_range
├── 检查端口是否耗尽
└── 调整端口范围
2.2 软中断问题
软中断问题
├── 检查软中断CPU
│ ├── cat /proc/softirqs | head -n2
│ ├── mpstat -P ALL 1
│ └── 确认CPU使用率
├── 检查中断亲和性
│ ├── cat /proc/irq/*/smp_affinity_list
│ ├── 检查中断分布
│ └── 调整中断绑定
└── 检查网卡丢包
├── ethtool -S eth0 | grep drop
├── 检查Ring Buffer
└── 调整队列大小
3. 延迟高
3.1 网络延迟
网络延迟
├── 检查RTT
│ ├── ping 目标IP
│ ├── 检查基线延迟
│ └── 对比正常值
├── 检查队列延迟
│ ├── tc -s qdisc show dev eth0
│ ├── 检查队列长度
│ └── 调整队列参数
├── 检查重传率
│ ├── ss -ti | grep retrans
│ ├── 检查重传次数
│ └── 分析重传原因
└── 检查CPU软中断
├── mpstat -P ALL 1
├── 检查软中断分布
└── 优化中断处理
3.2 应用延迟
应用延迟
├── 检查应用处理时间
│ ├── 应用日志
│ ├── 性能监控
│ └── 分析瓶颈
├── 检查数据库延迟
│ ├── 数据库连接时间
│ ├── 查询执行时间
│ └── 连接池状态
└── 检查缓存命中率
├── 缓存统计
├── 命中率分析
└── 缓存配置
4. 吞吐量低
4.1 网络吞吐量
网络吞吐量
├── 检查TCP窗口
│ ├── ss -ti | grep rtt
│ ├── 检查窗口大小
│ └── 调整窗口参数
├── 检查拥塞算法
│ ├── cat /proc/sys/net/ipv4/tcp_congestion_control
│ ├── 测试不同算法
│ └── 选择合适算法
├── 检查MTU
│ ├── ip link show | grep mtu
│ ├── 检查MTU设置
│ └── 避免分片
└── 检查offload特性
├── ethtool -k eth0
├── 检查GRO/GSO/TSO
└── 启用offload
4.2 应用吞吐量
应用吞吐量
├── 检查连接池
│ ├── 连接池大小
│ ├── 连接复用
│ └── 连接超时
├── 检查批处理
│ ├── 批处理大小
│ ├── 批处理频率
│ └── 批处理效率
└── 检查零拷贝
├── sendfile使用
├── io_uring使用
└── 减少拷贝次数
具体问题排查
问题1:无法建立连接
症状:客户端无法连接到服务器
排查步骤:
检查服务是否监听
ss -tuln | grep 端口 netstat -tuln | grep 端口检查防火墙规则
sudo iptables -L -n | grep 端口 sudo iptables -L -n | grep ACCEPT检查网络连通性
ping 服务器IP telnet 服务器IP 端口检查服务状态
systemctl status 服务名 journalctl -u 服务名
解决方案:
- 启动服务
- 配置防火墙
- 检查网络配置
- 修复服务配置
问题2:连接超时
症状:连接建立缓慢或超时
排查步骤:
检查网络延迟
ping 目标IP traceroute 目标IP检查连接队列
ss -s cat /proc/sys/net/core/somaxconn检查重传情况
ss -ti | grep retrans cat /proc/net/snmp | grep -i tcp检查系统负载
top mpstat -P ALL 1
解决方案:
- 优化网络配置
- 调整连接参数
- 增加系统资源
- 优化应用代码
问题3:频繁重传
症状:网络连接不稳定,频繁重传
排查步骤:
检查网络质量
ping -c 100 目标IP mtr 目标IP检查MTU设置
ip link show | grep mtu ping -M do -s 1472 目标IP检查拥塞控制
cat /proc/sys/net/ipv4/tcp_congestion_control ss -ti | grep rtt检查网卡状态
ethtool -S eth0 | grep -i error ethtool -S eth0 | grep -i drop
解决方案:
- 修复网络问题
- 调整MTU设置
- 优化拥塞控制
- 更换网卡或驱动
问题4:DNS解析慢
症状:域名解析耗时过长
排查步骤:
检查DNS配置
cat /etc/resolv.conf nslookup 域名检查DNS服务器
dig @8.8.8.8 域名 dig +trace 域名检查DNS缓存
systemctl status systemd-resolved systemd-resolve --status检查网络延迟
ping 8.8.8.8 ping 1.1.1.1
解决方案:
- 更换DNS服务器
- 启用DNS缓存
- 优化网络配置
- 检查防火墙规则
问题5:Kubernetes网络问题
症状:Pod间无法通信
排查步骤:
检查Pod状态
kubectl get pods -o wide kubectl describe pod pod-name检查Service配置
kubectl get svc kubectl get endpoints kubectl describe svc service-name检查NetworkPolicy
kubectl get networkpolicies kubectl describe networkpolicy policy-name检查CNI配置
kubectl get nodes -o wide kubectl describe node node-name
解决方案:
- 修复Pod配置
- 调整Service配置
- 修改NetworkPolicy
- 检查CNI插件
常用排查工具
网络诊断工具
- ping: 测试连通性
- traceroute: 路由追踪
- tcpdump: 抓包分析
- wireshark: 图形化抓包
- netstat: 网络连接状态
- ss: 套接字统计
- iftop: 实时流量监控
- nethogs: 进程流量监控
系统监控工具
- top: 进程监控
- htop: 增强版top
- mpstat: CPU监控
- iostat: 磁盘监控
- sar: 系统活动报告
- vmstat: 虚拟内存统计
- free: 内存使用情况
- df: 磁盘使用情况
网络配置工具
- ip: 网络配置
- ethtool: 网卡配置
- iptables: 防火墙配置
- nftables: 新一代防火墙
- tc: 流量控制
- bridge: 网桥管理
- ovs-vsctl: Open vSwitch管理
预防措施
监控告警
- 设置网络监控
- 配置性能告警
- 定期健康检查
- 建立监控仪表板
定期维护
- 更新系统补丁
- 优化网络配置
- 清理日志文件
- 检查硬件状态
备份恢复
- 配置文件备份
- 网络拓扑备份
- 故障恢复预案
- 定期演练