网络性能优化

核心知识点

1. 网络性能基础

1.1 网络性能指标

┌─────────────────────────────────────────────────────┐
│              网络性能指标                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐          │
│   │ 带宽    │  │ 吞吐量  │  │ 延迟    │          │
│   │         │  │         │  │         │          │
│   │ Mbps    │  │ MB/s    │  │ ms      │          │
│   │ Gbps    │  │ 包/秒    │  │ 抖动    │          │
│   └─────────┘  └─────────┘  └─────────┘          │
│                                                     │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐          │
│   │ 丢包率  │  │ 连接数  │  │ 重传率  │          │
│   │         │  │         │  │         │          │
│   │ %       │  │ 当前    │  │ %       │          │
│   │         │  │ 最大    │  │         │          │
│   └─────────┘  └─────────┘  └─────────┘          │
│                                                     │
└─────────────────────────────────────────────────────┘

1.2 TCP/IP 协议栈

┌─────────────────────────────────────────────────────┐
│              TCP/IP 协议栈                          │
├─────────────────────────────────────────────────────┤
│                                                     │
│   ┌─────────────────────────────────────────┐       │
│   │           应用层                       │       │
│   │  HTTP, FTP, SMTP, DNS, SSH            │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           传输层                       │       │
│   │  TCP, UDP, SCTP                        │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           网络层                       │       │
│   │  IP, ICMP, IGMP                        │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           链路层                       │       │
│   │  Ethernet, Wi-Fi, PPP                  │       │
│   └─────────────────────────────────────────┘       │
│                                                     │
└─────────────────────────────────────────────────────┘

1.3 网络性能瓶颈

瓶颈类型 表现 原因
带宽限制 吞吐量低 网络带宽不足、拥塞
高延迟 响应时间长 路由跳数多、网络拥塞
丢包 重传率高 网络质量差、拥塞
连接数限制 拒绝连接 系统限制、配置不当
CPU 瓶颈 软中断高 网络流量大、单核处理

2. 网络监控工具

2.1 基础监控工具

# ifconfig - 网络接口配置
ifconfig
ifconfig eth0

# ip - 网络配置工具
ip addr show
ip link show
ip route show

# netstat - 网络统计
netstat -an
netstat -s
netstat -i

# ss - 套接字统计
ss -s
ss -tunap

2.2 流量监控工具

# iftop - 实时流量监控
iftop
iftop -i eth0

# nload - 流量监控
nload
nload -t 1000 -l 10

# bmon - 带宽监控
bmon
bmon -o curses

# iptraf - 交互式流量监控
iptraf
iptraf-ng

2.3 连接监控

# 查看连接数
ss -s
netstat -an | wc -l

# 查看各状态连接
ss -tan state established
ss -tan state time-wait
ss -tan state close-wait

# 查看连接详情
ss -tnp
netstat -tnp

# 查看连接统计
netstat -s | grep -i tcp

2.4 性能测试工具

# ping - 延迟测试
ping -c 100 google.com

# traceroute - 路由跟踪
traceroute google.com
tracepath google.com

# mtr - 网络诊断
mtr google.com

# iperf3 - 带宽测试
iperf3 -s
iperf3 -c <server-ip> -t 60

3. TCP 参数优化

3.1 TCP 连接优化

# 增加 TCP 连接队列
echo 4096 > /proc/sys/net/core/somaxconn
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog

# 减少 TIME_WAIT 状态时间
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

# 启用 TIME_WAIT 重用
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

# 永久设置
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 4096" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf

3.2 TCP 缓冲区优化

# 调整 TCP 读写缓冲区
echo 87380 > /proc/sys/net/ipv4/tcp_rmem_min
echo 174760 > /proc/sys/net/ipv4/tcp_rmem_default
echo 349520 > /proc/sys/net/ipv4/tcp_rmem_max

echo 16384 > /proc/sys/net/ipv4/tcp_wmem_min
echo 131072 > /proc/sys/net/ipv4/tcp_wmem_default
echo 262144 > /proc/sys/net/ipv4/tcp_wmem_max

# 调整 TCP 自动调优
echo 1 > /proc/sys/net/ipv4/tcp_moderate_rcvq

# 永久设置
echo "net.ipv4.tcp_rmem = 87380 174760 349520" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 16384 131072 262144" >> /etc/sysctl.conf
echo "net.ipv4.tcp_moderate_rcvq = 1" >> /etc/sysctl.conf

3.3 TCP 拥塞控制优化

# 查看可用拥塞控制算法
sysctl net.ipv4.tcp_available_congestion_control

# 设置拥塞控制算法
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control

# 其他可用算法:cubic, reno, htcp, vegas

# 永久设置
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf

3.4 TCP 快速打开

# 启用 TCP Fast Open
echo 3 > /proc/sys/net/ipv4/tcp_fastopen

# 永久设置
echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf

4. 网络参数优化

4.1 网络缓冲区优化

# 调整网络缓冲区
echo 262144 > /proc/sys/net/core/rmem_default
echo 262144 > /proc/sys/net/core/rmem_max
echo 262144 > /proc/sys/net/core/wmem_default
echo 262144 > /proc/sys/net/core/wmem_max

# 调整 netdev_max_backlog
echo 5000 > /proc/sys/net/core/netdev_max_backlog

# 永久设置
echo "net.core.rmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.rmem_max = 262144" >> /etc/sysctl.conf
echo "net.core.wmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.wmem_max = 262144" >> /etc/sysctl.conf
echo "net.core.netdev_max_backlog = 5000" >> /etc/sysctl.conf

4.2 连接跟踪优化

# 增加 conntrack 表大小
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max

# 调整 conntrack 超时
echo 120 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

# 永久设置
echo "net.netfilter.nf_conntrack_max = 262144" >> /etc/sysctl.conf
echo "net.netfilter.nf_conntrack_tcp_timeout_established = 120" >> /etc/sysctl.conf

4.3 IP 参数优化

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 禁用 ICMP 重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# 启用 SYN cookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# 永久设置
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf

5. 网络性能测试

5.1 带宽测试

# 使用 iperf3 测试带宽
# 服务端
iperf3 -s

# 客户端
iperf3 -c <server-ip> -t 60
iperf3 -c <server-ip> -t 60 -P 4

# 测试 UDP
iperf3 -c <server-ip> -u -b 1G

# 测试双向
iperf3 -c <server-ip> -d

5.2 延迟测试

# 使用 ping 测试延迟
ping -c 100 google.com

# 使用 mtr 测试延迟
mtr -c 100 google.com

# 使用 hping3 测试延迟
hping3 -c 100 -i u1000 google.com

5.3 丢包测试

# 使用 ping 测试丢包
ping -c 1000 google.com | grep "packet loss"

# 使用 mtr 测试丢包
mtr -c 100 -r google.com

# 使用 hping3 测试丢包
hping3 -c 1000 -i u1000 google.com

5.4 连接测试

# 测试最大连接数
ab -n 10000 -c 1000 http://localhost/

# 测试并发连接
wrk -t12 -c400 -d30s http://localhost/

# 测试长连接
ab -n 10000 -c 100 -k http://localhost/

实用案例分析

案例 1:优化 Web 服务器网络性能

场景描述

Web 服务器网络吞吐量低,响应时间长。

操作步骤

# 1. 监控网络性能
iftop
nload
ss -s

# 2. 分析网络瓶颈
netstat -an | wc -l
netstat -s | grep -i tcp

# 3. 优化 TCP 参数
echo 4096 > /proc/sys/net/core/somaxconn
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

# 4. 优化 TCP 缓冲区
echo 87380 174760 349520 > /proc/sys/net/ipv4/tcp_rmem
echo 16384 131072 262144 > /proc/sys/net/ipv4/tcp_wmem

# 5. 启用 BBR 拥塞控制
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control

# 6. 优化 Web 服务器配置
# 启用 Keep-Alive
# 启用压缩
# 使用 CDN

# 7. 优化应用层
# 减少请求数
# 使用缓存
# 异步处理

# 8. 验证优化效果
iftop
ab -n 10000 -c 100 http://localhost/

案例 2:优化数据库网络性能

场景描述

数据库网络延迟高,影响查询性能。

操作步骤

# 1. 监控网络延迟
ping -c 100 <db-server>
mtr -c 100 <db-server>

# 2. 分析网络问题
traceroute <db-server>
netstat -s | grep -i tcp

# 3. 优化 TCP 参数
echo 1 > /proc/sys/net/ipv4/tcp_low_latency
echo 1 > /proc/sys/net/ipv4.tcp_no_metrics_save

# 4. 优化 TCP 缓冲区
echo 174760 > /proc/sys/net/ipv4/tcp_rmem_default
echo 349520 > /proc/sys/net/ipv4/tcp_rmem_max

# 5. 启用 TCP Fast Open
echo 3 > /proc/sys/net/ipv4/tcp_fastopen

# 6. 优化网络配置
# 使用专用网络
# 减少网络跳数
# 使用更快的网络设备

# 7. 优化数据库配置
# 启用连接池
# 调整超时时间
# 使用压缩

# 8. 验证优化效果
ping -c 100 <db-server>
mysql -h <db-server> -e "SELECT 1;"

案例 3:优化高并发网络应用

场景描述

高并发网络应用连接数受限。

操作步骤

# 1. 监控连接数
ss -s
netstat -an | wc -l

# 2. 查看系统限制
ulimit -n
cat /proc/sys/fs/file-max

# 3. 增加文件描述符限制
ulimit -n 65535
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

# 4. 增加 TCP 连接队列
echo 4096 > /proc/sys/net/core/somaxconn
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog

# 5. 减少 TIME_WAIT 状态
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

# 6. 增加 conntrack 表
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max

# 7. 优化应用层
# 使用连接池
# 使用异步 I/O
# 使用事件驱动

# 8. 验证优化效果
ss -s
ab -n 10000 -c 1000 http://localhost/

最佳实践

  1. 启用 BBR 拥塞控制:提升网络吞吐量。
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control
  1. 优化 TCP 缓冲区:根据网络带宽调整。
echo 87380 174760 349520 > /proc/sys/net/ipv4/tcp_rmem
  1. 增加连接队列:支持更多并发连接。
echo 4096 > /proc/sys/net/core/somaxconn
  1. 减少 TIME_WAIT 状态:重用连接。
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
  1. 使用连接池:减少连接建立开销。

  2. 启用 TCP Fast Open:减少连接延迟。

echo 3 > /proc/sys/net/ipv4/tcp_fastopen
  1. 监控网络性能:及时发现性能问题。

  2. 定期测试网络:验证网络性能。

总结

本教程详细介绍了 Linux 系统网络性能优化的方法和工具。通过实际案例,我们学习了如何优化 TCP 参数、调整网络缓冲区、配置拥塞控制以及测试网络性能。掌握这些知识后,可以显著提升系统网络吞吐量和降低延迟。

« 上一篇 磁盘性能优化 下一篇 » 故障排查方法论