跳到主要内容

网络性能分析与调优

网络分析工具

# 实时流量监控
iftop -nNP # 按连接查看流量
nethogs # 按进程查看流量
sar -n DEV 1 5 # 网卡收发包统计

# TCP 连接状态统计
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn

# 延迟与丢包
ping -c 100 target # 基础延迟测试
mtr target # 逐跳追踪丢包
traceroute -T target # TCP traceroute

# 抓包分析
tcpdump -i eth0 -nn port 80 -w capture.pcap
# 然后用 Wireshark 分析

TCP 连接状态排查

注意

CLOSE_WAIT 堆积几乎总是应用层 Bug(忘记 close socket),不要试图用内核参数修复。

网络调优参数

/etc/sysctl.d/99-network.conf
# 连接数相关
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# TIME_WAIT 处理
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

# 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216

# 开启 TCP Fast Open
net.ipv4.tcp_fastopen = 3

带宽测试

# iperf3 带宽测试(服务端 + 客户端)
iperf3 -s # 服务端
iperf3 -c server_ip -t 30 # 客户端

常见面试问题

Q1: TIME_WAIT 过多怎么处理?

答案

TIME_WAIT 是 TCP 四次挥手后主动关闭方的正常状态,持续 2MSL(通常 60s)。大量 TIME_WAIT 说明短连接频繁。

解决方案:

  1. 开启连接复用net.ipv4.tcp_tw_reuse = 1
  2. 缩短 FIN 超时net.ipv4.tcp_fin_timeout = 15
  3. 使用长连接:HTTP Keep-Alive、连接池
  4. 不建议tcp_tw_recycle(NAT 环境下会丢包,已在内核 4.12 移除)

相关链接