大数跨境
0
0

Linux内核参数优化:百万并发Web服务的sysctl调优手册

Linux内核参数优化:百万并发Web服务的sysctl调优手册 红帽Linux认证
2025-11-07
0

Linux内核参数优化:百万并发Web服务的sysctl调优手册


适用场景 & 前置条件

项目
要求
适用场景
日均PV 1000万+ / QPS 10万+ 的高并发Web服务、API网关、负载均衡器
OS
RHEL/CentOS 8.5+ 或 Ubuntu 20.04+
内核
Linux Kernel 5.10+(推荐 5.15+ / 6.1+)
硬件规格
最小:16C32G / 推荐:32C64G / 万兆网卡
网络
万兆网卡(10Gbps)、交换机支持 jumbo frame(MTU 9000)
权限
root 权限(修改内核参数)
技能要求
熟悉 TCP/IP 协议栈、Linux 内核参数、网络编程

反模式警告(何时不适用)

⚠️ 以下场景不推荐使用本方案:

  1. 1. 小流量应用:QPS < 1000,默认内核参数足够,过度优化反而增加维护成本
  2. 2. 桌面系统/开发环境:这些优化针对服务器,桌面系统可能导致响应延迟
  3. 3. 容器环境部分参数:Docker/Kubernetes 部分参数由宿主机控制,容器内无法修改
  4. 4. 非长连接场景:短连接(如爬虫)需要不同的优化策略(TIME_WAIT 快速回收)
  5. 5. 特定硬件环境:部分参数依赖硬件特性(如 TCP offload),虚拟化环境可能不适用

替代方案对比:

场景
推荐方案
理由
容器环境
宿主机优化 + cgroup 限制
容器共享宿主机内核
低延迟场景
DPDK / XDP 内核旁路
绕过内核协议栈,延迟 < 10us
小流量场景
默认参数 + 应用层优化
先优化代码,再优化内核
UDP 场景
专门的 UDP 调优参数
本文侧重 TCP

环境与版本矩阵

组件
RHEL/CentOS
Ubuntu/Debian
测试状态
OS 版本
RHEL 9.3 / CentOS Stream 9
Ubuntu 22.04 LTS
[已实测]
内核版本
5.14.0-362+
5.15.0-92+
[已实测]
内核版本(推荐)
6.1+ (更好的 BBR v2 支持)
6.1+
[理论推导]
硬件规格(最小)
16C32G / 双万兆网卡
16C32G / 双万兆网卡
-
硬件规格(推荐)
32C64G / 双万兆网卡 / NVMe SSD
32C64G / 双万兆网卡 / NVMe SSD
-

内核版本差异说明:

  • • Kernel 5.10 vs 5.15:5.15 改进 TCP BBR 拥塞控制算法
  • • Kernel 5.15 vs 6.1:6.1 支持 BBR v2、io_uring 改进、更好的 cgroup v2 支持
  • • Kernel 4.x:部分参数不支持(如 tcp_mtu_probing),不推荐高并发场景

阅读导航

📖 建议阅读路径:

快速上手(30分钟):→ 快速清单 → 实施步骤 Step 1-3(网络参数) → 验证测试

深入理解(90分钟):→ 最小必要原理 → 实施步骤完整版 → 性能基准测试 → 最佳实践

故障排查:→ 常见故障与排错 → 调试思路 → FAQ


快速清单(Checklist)

  • • [ ] 准备阶段
    • • [ ] 备份当前内核参数(sysctl -a > /tmp/sysctl_backup.conf
    • • [ ] 检查内核版本(uname -r >= 5.10
    • • [ ] 检查网卡型号与驱动(ethtool -i eth0
    • • [ ] 检查当前连接数(ss -s
  • • [ ] 网络参数优化
    • • [ ] TCP 连接队列(net.core.somaxconn
    • • [ ] TCP 缓冲区(net.ipv4.tcp_rmem/wmem
    • • [ ] TIME_WAIT 优化(net.ipv4.tcp_fin_timeout
    • • [ ] TCP 拥塞控制(net.ipv4.tcp_congestion_control = bbr
  • • [ ] 文件描述符优化
    • • [ ] 系统级限制(fs.file-max
    • • [ ] 进程级限制(/etc/security/limits.conf
    • • [ ] 检查当前使用量(lsof | wc -l
  • • [ ] 内存参数优化
    • • [ ] Swap 使用策略(vm.swappiness
    • • [ ] 脏页刷新(vm.dirty_ratio
    • • [ ] 透明大页(transparent_hugepage
  • • [ ] 验证与测试
    • • [ ] 应用配置(sysctl -p
    • • [ ] 性能基准测试(wrk/ab)
    • • [ ] 监控关键指标(netstat/ss)

实施步骤

Step 1: 网络参数优化(核心)

目标: 优化 TCP 协议栈,支持百万并发连接

1.1 TCP 连接队列优化

配置文件:/etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf

# TCP 连接队列(最关键的参数)
net.core.somaxconn = 65535# listen() 的 backlog 上限
net.ipv4.tcp_max_syn_backlog = 8192# SYN 队列长度(半连接)
net.core.netdev_max_backlog = 16384# 网卡接收队列长度

# 说明:
# - somaxconn:应用 listen() 时的 backlog 参数上限,默认 128 太小
# - tcp_max_syn_backlog:半连接队列,防止 SYN Flood 攻击
# - netdev_max_backlog:网卡驱动到内核协议栈的队列

关键参数解释:

  1. 1. net.core.somaxconn:全连接队列上限,应用 listen(fd, backlog) 的 backlog 参数不能超过此值
  2. 2. net.ipv4.tcp_max_syn_backlog:半连接队列,SYN_RECV 状态的连接数上限
  3. 3. 全连接队列实际大小 = min(backlog, somaxconn)

执行前验证:

# 查看当前值
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
# 预期输出:128 / 512(默认值太小)

# 查看当前连接状态统计
ss -s
# 输出示例:
# TCP: 15000 (estab 12000, closed 2000, orphaned 50, synrecv 100, timewait 1900)

# 检查全连接队列溢出(重要!)
netstat -s | grep -i "listen"
# 关键指标:times the listen queue of a socket overflowed(队列溢出次数)

执行后验证:

# 应用配置
sysctl -p

# 验证生效
sysctl net.core.somaxconn
# 预期输出:65535 [已实测]

# 压测验证(使用 wrk 模拟高并发)
wrk -t10 -c10000 -d30s http://localhost/
# 观察是否有连接被拒绝

常见错误示例:

# 错误1:应用 backlog 参数超过 somaxconn
# 现象:netstat -s 显示 "listen queue of a socket overflowed" 持续增长
# 解决:增大 net.core.somaxconn 到 65535

# 错误2:Nginx/Java 应用 backlog 未调整
# Nginx 配置:listen 80 backlog=65535;
# Java Tomcat:<Connector port="8080" acceptCount="8192"/>
# 解决:应用层配置需同步调整

1.2 TCP 缓冲区优化

# TCP 接收缓冲区(自动调整)
net.ipv4.tcp_rmem = 40968738016777216
# 格式:最小值 默认值 最大值(单位:字节)
# 4KB  85KB    16MB

# TCP 发送缓冲区
net.ipv4.tcp_wmem = 40966553616777216
# 4KB  64KB    16MB

# 核心缓冲区限制
net.core.rmem_max = 16777216# 接收缓冲区最大值
net.core.wmem_max = 16777216# 发送缓冲区最大值
net.core.rmem_default = 262144# 默认接收缓冲区 256KB
net.core.wmem_default = 262144# 默认发送缓冲区 256KB

# TCP 内存管理(单位:页,1页=4KB)
net.ipv4.tcp_mem = 78643210485761572864
# 低水位    压力阈值   高水位
# 3GB       4GB        6GB
# 说明:
# - 低于低水位:不限制
# - 达到压力阈值:开始限制新连接
# - 达到高水位:拒绝新连接

关键参数解释:

  1. 1. tcp_rmem/wmem:三个值分别是 min、default、max,内核会自动在此范围内调整
  2. 2. tcp_mem:全局 TCP 内存限制(所有连接共享),以页为单位(4KB/页)
  3. 3. 高水位计算公式:总内存(GB) * 0.1 * 256(页数/MB),例如 64GB 内存 = 64 * 0.1 * 256 = 1638400

执行后验证:

# 查看当前 TCP 内存使用
cat /proc/net/sockstat
# 输出示例:
# TCP: inuse 12000 orphan 50 tw 1900 alloc 15000 mem 120000

# 查看单个连接的缓冲区大小
ss -tm state established '( dport = :80 )'
# 输出示例:
# Recv-Q Send-Q Local Address:Port Peer Address:Port
# 0      0      192.168.1.10:80  192.168.1.100:54321
#  skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
# rb=接收缓冲区,tb=发送缓冲区

1.3 TIME_WAIT 状态优化

# TIME_WAIT 超时时间(默认 60 秒,可缩短到 30 秒)
net.ipv4.tcp_fin_timeout = 30

# 允许 TIME_WAIT 套接字重用(用于新的连接)
net.ipv4.tcp_tw_reuse = 1

# 快速回收 TIME_WAIT 套接字(慎用!可能导致 NAT 环境问题)
# net.ipv4.tcp_tw_recycle = 1  # Kernel 4.12+ 已移除此参数

# TCP Keepalive 探测
net.ipv4.tcp_keepalive_time = 600# 10分钟无数据才开始探测
net.ipv4.tcp_keepalive_intvl = 10# 探测间隔 10 秒
net.ipv4.tcp_keepalive_probes = 3# 探测 3 次失败则关闭连接

# TCP 连接超时
net.ipv4.tcp_syn_retries = 2# SYN 重传次数(客户端)
net.ipv4.tcp_synack_retries = 2# SYN-ACK 重传次数(服务端)

关键参数解释:

  1. 1. tcp_fin_timeout:TIME_WAIT 状态持续时间,默认 60 秒,高并发场景可缩短到 15-30 秒
  2. 2. tcp_tw_reuse:允许新连接重用 TIME_WAIT 套接字(仅对客户端有效)
  3. 3. 警告tcp_tw_recycle 在 NAT 环境会导致连接失败(因为时间戳检查),Kernel 4.12+ 已移除

执行后验证:

# 查看 TIME_WAIT 连接数量
ss -ant | grep TIME_WAIT | wc -l

# 持续监控(每秒刷新)
watch -n 1 "ss -ant | grep TIME_WAIT | wc -l"

# 查看 TIME_WAIT 连接详情
ss -tan state time-wait | head -20

常见错误示例:

# 错误1:TIME_WAIT 连接过多(> 10000)
# 原因:大量短连接,默认 60 秒太长
# 解决:tcp_fin_timeout = 15

# 错误2:NAT 环境启用 tcp_tw_recycle
# 现象:部分客户端连接失败(PAWS 时间戳检查失败)
# 解决:关闭 tcp_tw_recycle,仅使用 tcp_tw_reuse

1.4 TCP 拥塞控制算法

# 启用 BBR 拥塞控制算法(Kernel 4.9+)
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq  # Fair Queue 调度算法(BBR 需要)

# 可选:查看支持的拥塞控制算法
# cat /proc/sys/net/ipv4/tcp_available_congestion_control
# 输出:reno cubic bbr

# TCP 拥塞窗口限制
net.ipv4.tcp_slow_start_after_idle = 0# 禁用慢启动(长连接场景)
net.ipv4.tcp_no_metrics_save = 1# 不缓存连接指标(避免过时)

关键参数解释:

  1. 1. BBR(Bottleneck Bandwidth and RTT):Google 开发的拥塞控制算法,相比 CUBIC 提升 2-10 倍吞吐量
  2. 2. default_qdisc = fq:BBR 需要配合 Fair Queue 调度算法
  3. 3. tcp_slow_start_after_idle = 0:禁用空闲后慢启动,适合长连接(如 WebSocket)

执行前验证:

# 检查内核是否支持 BBR
grep -i bbr /proc/sys/net/ipv4/tcp_available_congestion_control
# 预期输出:reno cubic bbr

# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
# 预期输出:cubic(默认)

# 检查内核版本(需要 4.9+)
uname -r
# 预期输出:5.15.0+

执行后验证:

# 应用配置
sysctl -p

# 验证生效
sysctl net.ipv4.tcp_congestion_control
# 预期输出:bbr [已实测]

# 查看 BBR 统计信息(Kernel 5.0+)
ss -ti | grep bbr
# 输出示例:
#  cubic bbr wscale:7,7 rto:204 rtt:3.5/0.5 ato:40 mss:1448 cwnd:10 bytes_acked:1234567

# 性能对比测试(iperf3)
# BBR vs CUBIC:
# CUBIC: 500 Mbps
# BBR:   800 Mbps(提升 60%)

常见错误示例:

# 错误1:内核不支持 BBR
sysctl: cannot stat /proc/sys/net/ipv4/tcp_congestion_control: No such file or directory
# 解决:升级内核到 4.9+

# 错误2:未配置 fq 调度器
# 现象:BBR 效果不明显
# 解决:sysctl net.core.default_qdisc=fq

# 错误3:云环境内核模块未加载
# 解决:modprobe tcp_bbr && echo "tcp_bbr" >> /etc/modules-load.d/modules.conf

1.5 其他网络参数

# 启用 TCP Fast Open(Kernel 3.7+)
net.ipv4.tcp_fastopen = 3
# 1=客户端启用,2=服务端启用,3=双向启用
# TFO 可减少 1 RTT,适合短连接

# 启用 TCP 时间戳
net.ipv4.tcp_timestamps = 1# 必须启用(BBR 依赖)

# 启用 TCP SACK(选择性确认)
net.ipv4.tcp_sack = 1# 提升丢包恢复效率

# 启用 TCP 窗口缩放
net.ipv4.tcp_window_scaling = 1

# 最大 TCP 孤儿套接字数量
net.ipv4.tcp_max_orphans = 262144

# 本地端口范围(客户端连接使用)
net.ipv4.ip_local_port_range = 102465535

# 禁用 ICMP 重定向(安全)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 启用反向路径过滤(防 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

Step 2: 文件描述符优化

目标: 支持百万级并发连接(每个连接占用1个文件描述符)

2.1 系统级限制

# /etc/sysctl.conf
fs.file-max = 2097152# 系统最大文件描述符数量(200万)

# 查看当前使用量
cat /proc/sys/fs/file-nr
# 输出格式:已分配  已使用  最大值
# 示例:12000  10000  2097152

2.2 进程级限制

配置文件:/etc/security/limits.conf

# 所有用户
* soft nofile 1048576
* hard nofile 1048576

# 特定用户(如 nginx)
nginx soft nofile 1048576
nginx hard nofile 1048576

# root 用户
root soft nofile 1048576
root hard nofile 1048576

# 其他资源限制
* soft nproc 65535   # 最大进程数
* hard nproc 65535
* soft stack 10240   # 栈大小(KB)
* hard stack 10240

立即生效(当前会话):

ulimit -n 1048576
ulimit -u 65535

永久生效(需重新登录或重启服务):

# 修改 systemd 服务限制(以 nginx 为例)
mkdir -p /etc/systemd/system/nginx.service.d
cat > /etc/systemd/system/nginx.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=1048576
LimitNPROC=65535
EOF


systemctl daemon-reload
systemctl restart nginx

执行后验证:

# 验证系统级限制
cat /proc/sys/fs/file-max
# 预期输出:2097152 [已实测]

# 验证进程级限制
ulimit -n
# 预期输出:1048576

# 验证特定进程限制(以 nginx 为例)
cat /proc/$(pgrep nginx | head -1)/limits | grep "open files"
# 预期输出:Max open files  1048576  1048576  files

# 查看当前系统文件描述符使用情况
lsof | wc -l
# 或
cat /proc/sys/fs/file-nr | awk '{print $1-$2}'# 可用数量

Step 3: 内存参数优化

目标: 优化内存管理,减少 Swap 使用,提升缓存效率

# /etc/sysctl.conf

# Swap 使用策略(0-100,越小越不使用 swap)
vm.swappiness = 10
# 0 = 仅内存不足时才 swap(Kernel 3.5+ 建议设为 1)
# 10 = 推荐值(数据库/缓存服务器)
# 60 = 默认值(桌面系统)

# 脏页刷新策略
vm.dirty_ratio = 20# 脏页达到 20% 时同步写入磁盘
vm.dirty_background_ratio = 10# 后台刷新阈值 10%
vm.dirty_expire_centisecs = 3000# 脏页过期时间 30 秒
vm.dirty_writeback_centisecs = 500# 后台刷新间隔 5 秒

# 虚拟内存行为
vm.overcommit_memory = 1# 允许内存过度分配(Redis 需要)
vm.overcommit_ratio = 50# 过度分配比例 50%

# 透明大页(THP)- 数据库场景建议禁用
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 最小空闲内存(KB)
vm.min_free_kbytes = 262144# 保留 256MB 空闲内存

关键参数解释:

  1. 1. vm.swappiness:控制内核使用 swap 的倾向,数据库/缓存建议 1-10
  2. 2. vm.dirty_ratio:脏页比例达到此值时,进程阻塞等待刷盘
  3. 3. vm.overcommit_memory = 1:允许进程申请超过物理内存的虚拟内存(Redis fork 需要)

执行后验证:

# 查看当前 swap 使用情况
free -h
# 输出示例:
#               total        used        free      shared  buff/cache   available
# Mem:           62Gi       10Gi       40Gi       1.0Gi        12Gi        50Gi
# Swap:          8.0Gi        0B       8.0Gi

# 查看脏页比例
cat /proc/vmstat | grep dirty
# 输出示例:
# nr_dirty 1200
# nr_writeback 50

# 验证透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 预期输出:[never](数据库场景)或 [always](通用场景)

Step 4: 完整配置文件示例

文件路径:/etc/sysctl.d/99-high-performance.conf

# ============================
# 高并发 Web 服务器内核参数优化
# 适用场景:百万并发连接
# 测试环境:Ubuntu 22.04 / Kernel 5.15+
# ============================

# ===== 网络参数 =====

# TCP 连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384

# TCP 缓冲区
net.ipv4.tcp_rmem = 40968738016777216
net.ipv4.tcp_wmem = 40966553616777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144

# TCP 内存管理(64GB 内存环境)
net.ipv4.tcp_mem = 78643210485761572864

# TIME_WAIT 优化
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 55000

# TCP Keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3

# TCP 连接超时
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

# TCP 拥塞控制(BBR)
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

# TCP 其他优化
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_max_orphans = 262144

# 本地端口范围
net.ipv4.ip_local_port_range = 102465535

# 安全参数
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1

# ===== 文件描述符 =====
fs.file-max = 2097152

# ===== 内存管理 =====
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
vm.overcommit_memory = 1
vm.overcommit_ratio = 50
vm.min_free_kbytes = 262144

# ===== 内核其他参数 =====
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536

应用配置:

# 加载配置
sysctl -p /etc/sysctl.d/99-high-performance.conf

# 验证所有参数
sysctl -a | grep -E "(somaxconn|tcp_rmem|bbr|file-max|swappiness)"

# 持久化(重启后生效)
sysctl -p

Step 5: 网卡参数优化

目标: 优化网卡驱动参数,提升网络吞吐量

# 查看网卡型号与驱动
ethtool -i eth0
# 输出示例:
# driver: igb
# version: 5.4.0

# 查看当前网卡参数
ethtool -g eth0  # Ring buffer 大小
ethtool -k eth0  # Offload 特性
ethtool -S eth0  # 统计信息

# 优化 Ring Buffer(接收队列)
ethtool -G eth0 rx 4096 tx 4096

# 启用 Offload 特性(硬件加速)
ethtool -K eth0 tso on       # TCP Segmentation Offload
ethtool -K eth0 gso on       # Generic Segmentation Offload
ethtool -K eth0 gro on       # Generic Receive Offload
ethtool -K eth0 sg on        # Scatter-Gather
ethtool -K eth0 rx-checksumming on
ethtool -K eth0 tx-checksumming on

# 调整中断合并(Interrupt Coalescing)
ethtool -C eth0 rx-usecs 50 tx-usecs 50

# 启用多队列(RSS/RPS)
# 查看网卡队列数量
ethtool -l eth0
# 设置队列数量(需硬件支持)
ethtool -L eth0 combined 8

# 绑定中断到特定 CPU(IRQ Affinity)
# 脚本:/opt/scripts/set_irq_affinity.sh
#!/bin/bash
for IRQ in $(grep eth0 /proc/interrupts | awk '{print $1}' | sed 's/://'); do
echo 1 > /proc/irq/$IRQ/smp_affinity
done

持久化配置(systemd service):

# /etc/systemd/system/network-tuning.service
[Unit]
Description=Network Performance Tuning
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -G eth0 rx 4096 tx 4096
ExecStart=/usr/sbin/ethtool -K eth0 tso on gso on gro on
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

最小必要原理

核心机制:

Linux 内核网络协议栈是一个复杂的系统,包含多个层次:

应用层(Application)
    ↓
Socket API
    ↓
传输层(TCP/UDP)
    ↓  ← 本文优化重点
内核协议栈
    ↓
网卡驱动(Driver)
    ↓
物理网卡(NIC)

关键优化点:

  1. 1. TCP 连接队列
    • • 半连接队列(SYN Queue):存储 SYN_RECV 状态的连接
    • • 全连接队列(Accept Queue):存储 ESTABLISHED 但未被 accept() 的连接
    • • 队列满时新连接被丢弃,表现为 netstat -s 的 “listen queue overflowed”
  2. 2. TCP 缓冲区
    • • 接收缓冲区(rmem):存储已接收但未被应用读取的数据
    • • 发送缓冲区(wmem):存储应用写入但未被发送的数据
    • • 缓冲区大小影响 TCP 窗口大小,进而影响吞吐量
  3. 3. TIME_WAIT 状态
    • • 主动关闭连接的一方进入 TIME_WAIT 状态,持续 2MSL(默认 60 秒)
    • • 目的:防止旧连接的数据包干扰新连接
    • • 高并发场景会积累大量 TIME_WAIT 连接,占用端口资源
  4. 4. BBR 拥塞控制算法
    • • 传统算法(CUBIC):基于丢包判断拥塞,高延迟/丢包网络性能差
    • • BBR:基于带宽和 RTT 判断,即使丢包也能保持高吞吐
    • • 场景:跨国网络、移动网络、拥塞网络

为什么百万并发需要这些参数?

  1. 1. 连接数 100万 = 每个连接占用:
    • • 1个文件描述符
    • • ~3KB 内核内存(TCB 数据结构)
    • • 总计:100万 FD + 3GB 内存
  2. 2. 并发 10万 QPS = 每秒处理:
    • • 10万次 accept()
    • • 10万次 read()/write()
    • • 10万次 close()
    • • 需要极大的队列和缓冲区
  3. 3. 万兆网卡(10Gbps) = 理论极限:
    • • 10Gbps / 8 = 1.25GB/s
    • • 单个 MTU 1500 字节 → 约 83万 PPS(Packets Per Second)
    • • 需要优化网卡队列和中断处理

可观测性(监控 + 告警 + 性能)

监控指标

关键系统指标:

# 1. 网络连接统计
ss -s
# 输出示例:
# TCP: 850000 (estab 800000, closed 40000, orphaned 100, timewait 39000)

# 2. 文件描述符使用率
cat /proc/sys/fs/file-nr | awk '{printf "使用率: %.2f%%\n", ($1-$2)/$3*100}'

# 3. TCP 队列溢出
netstat -s | grep -i overflow
# 关键指标:times the listen queue of a socket overflowed

# 4. TCP 重传率
netstat -s | grep -i retrans
# 关键指标:segments retransmitted

# 5. 内存使用
free -h
cat /proc/meminfo | grep -E "(MemTotal|MemFree|Cached|SwapTotal|SwapFree)"

# 6. 网卡流量
sar -n DEV 1 10  # 每秒采样 10 次
# 输出示例:
# IFACE  rxpck/s  txpck/s  rxkB/s  txkB/s
# eth0   80000    80000    1000000 1000000

Prometheus 监控(node_exporter):

# 关键指标

# 1. TCP 连接数
node_netstat_Tcp_CurrEstab

# 2. TIME_WAIT 连接数
node_sockstat_TCP_tw

# 3. 文件描述符使用率
(node_filefd_allocated-node_filefd_maximum)/node_filefd_maximum*100

# 4. 网络吞吐量
rate(node_network_receive_bytes_total[1m])
rate(node_network_transmit_bytes_total[1m])

# 5. TCP 重传率
rate(node_netstat_Tcp_RetransSegs[5m])/rate(node_netstat_Tcp_OutSegs[5m])*100

# 6. 内存使用率
(node_memory_MemTotal_bytes-node_memory_MemFree_bytes-node_memory_Cached_bytes)/node_memory_MemTotal_bytes*100

Prometheus 告警规则:

groups:
-name:system_performance
interval:30s
rules:
# 告警1:TCP 连接数过多
-alert:HighTCPConnections
expr:node_netstat_Tcp_CurrEstab>500000
for:5m
labels:
severity:warning
annotations:
summary:"TCP 连接数过多 ({{ $labels.instance }})"
description:"当前 TCP 连接数 {{ $value }},超过阈值 500000"

# 告警2:TIME_WAIT 连接过多
-alert:HighTimeWaitConnections
expr:node_sockstat_TCP_tw>50000
for:5m
labels:
severity:warning
annotations:
summary:"TIME_WAIT 连接过多 ({{ $labels.instance }})"
description:"当前 TIME_WAIT 连接数 {{ $value }}"

# 告警3:文件描述符使用率过高
-alert:HighFileDescriptorUsage
expr:(node_filefd_allocated/node_filefd_maximum)*100>80
for:5m
labels:
severity:critical
annotations:
summary:"文件描述符使用率过高 ({{ $labels.instance }})"
description:"当前使用率 {{ $value }}%"

# 告警4:TCP 重传率过高
-alert:HighTCPRetransmissionRate
expr:rate(node_netstat_Tcp_RetransSegs[5m])/rate(node_netstat_Tcp_OutSegs[5m])*100>5
for:5m
labels:
severity:warning
annotations:
summary:"TCP 重传率过高 ({{ $labels.instance }})"
description:"当前重传率 {{ $value }}%"

# 告警5:Swap 使用率过高
-alert:HighSwapUsage
expr:(node_memory_SwapTotal_bytes-node_memory_SwapFree_bytes)/node_memory_SwapTotal_bytes*100>50
for:10m
labels:
severity:warning
annotations:
summary:"Swap 使用率过高 ({{ $labels.instance }})"
description:"当前 Swap 使用率 {{ $value }}%"

性能基准测试

工具:wrk(HTTP 压测)

# 安装 wrk
git clone https://github.com/wg/wrk.git
cd wrk && make
cp wrk /usr/local/bin/

# 测试1:短连接性能
wrk -t10 -c10000 -d30s --latency http://localhost/
# 参数:10 线程,1万并发,持续 30 秒

# 预期输出(优化后):
# Running 30s test @ http://localhost/
#   10 threads and 10000 connections
#   Thread Stats   Avg      Stdev     Max   +/- Stdev
#     Latency    50.12ms   10.23ms 200.00ms   75.23%
#     Req/Sec    20.50k     2.10k   30.00k    85.67%
#   Latency Distribution
#      50%   48.00ms
#      75%   55.00ms
#      90%   65.00ms
#      99%   90.00ms
#   6150000 requests in 30.00s, 5.12GB read
# Requests/sec: 205000.00
# Transfer/sec:   175.00MB

# 测试2:长连接性能
wrk -t10 -c10000 -d30s --latency -H "Connection: keep-alive" http://localhost/

# 测试3:自定义 Lua 脚本(POST 请求)
cat > post.lua <<'EOF'
wrk.method = "POST"
【声明】内容源于网络
0
0
红帽Linux认证
社区致力于分享红帽Linux及其他产品最新资讯,RHCSA/RHCE/RHCA认证动态。
内容 112
粉丝 0
红帽Linux认证 社区致力于分享红帽Linux及其他产品最新资讯,RHCSA/RHCE/RHCA认证动态。
总阅读15
粉丝0
内容112