网络调优是一门需要方法论支撑的工程实践。盲目修改 sysctl 参数不仅可能无效,还可能引入新问题——例如,增大 TCP 接收缓冲区可能缓解吞吐不足,却在高并发场景下耗尽内存触发 OOM。本文建立一套系统化的调优框架:先用基准测试建立性能基线,再通过可观测工具定位瓶颈层次,然后针对性地调整参数,最后通过 A/B 对比验证效果。每个 sysctl 参数都会对应到内核源码中的数据结构,让你理解”为什么这样调”。
一、调优方法论框架
1.1 调优的四个阶段
阶段一:基线测量
↓ 建立当前性能数据(吞吐、延迟、丢包率、CPU 使用率)
阶段二:瓶颈定位
↓ 通过可观测工具确定瓶颈在哪一层
阶段三:参数调整
↓ 针对瓶颈层次修改相应参数
阶段四:效果验证
→ 对比调优前后的性能数据,确认改善且无副作用
1.2 性能瓶颈的层次模型
网络性能瓶颈按从底层到上层可分为:
| 层次 | 瓶颈表现 | 诊断方法 | 调优手段 |
|---|---|---|---|
| 硬件/驱动 | ring buffer 溢出、中断不均衡 | ethtool -S、/proc/interrupts |
ring buffer 大小、RSS、中断亲和 |
| 软中断 | softirq 延迟、CPU 跑满 | mpstat、bpftrace softirq |
NAPI budget、RPS/RFS、CPU 隔离 |
| IP/路由 | 路由查找慢、分片超时 | perf top、ip route |
路由缓存、ECMP、PMTU |
| TCP/UDP | 重传率高、窗口受限 | ss -ti、nstat |
TCP 缓冲区、拥塞控制、TFO |
| Socket | 接收缓冲区满、backlog 溢出 | ss -lntp、nstat |
SO_RCVBUF、somaxconn、backlog |
| 应用 | 系统调用频繁、epoll 效率低 | strace、perf record |
io_uring、SO_BUSY_POLL、批处理 |
1.3 调优原则
- 一次只改一个参数:否则无法判断哪个改动产生了效果
- 测量驱动,不猜测:每次调整前后都要有量化数据
- 理解副作用:增大缓冲区会增加内存消耗,增大 backlog 会增加延迟
- 区分场景:吞吐优化和延迟优化的方向往往相反
- 记录每次变更:包括参数值、测量数据、内核版本
二、基准测试工具与方法
2.1 iperf3:吞吐量基准
# 服务端
iperf3 -s
# TCP 吞吐测试(10 秒,8 并行流)
iperf3 -c <server> -t 10 -P 8
# UDP 吞吐测试(指定带宽)
iperf3 -c <server> -u -b 10G -t 10
# 反向测试(服务端发送)
iperf3 -c <server> -R -t 10
# 关键指标:Bandwidth、Retr(重传次数)、Cwnd2.2 netperf:延迟基准
# 安装
apt install netperf
# TCP 请求/响应延迟(RR = Request/Response)
netperf -H <server> -t TCP_RR -l 30 -- -r 1,1
# TCP 流延迟(CRR = Connect/Request/Response,含建连)
netperf -H <server> -t TCP_CRR -l 30
# UDP 请求/响应延迟
netperf -H <server> -t UDP_RR -l 30
# 关键指标:Transaction Rate(次/秒)、延迟 = 1/Rate2.3 基线数据收集脚本
#!/bin/bash
# baseline.sh - 收集网络性能基线数据
OUTDIR="baseline-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$OUTDIR"
# 系统信息
uname -r > "$OUTDIR/kernel.txt"
cat /proc/cpuinfo | grep 'model name' | head -1 >> "$OUTDIR/kernel.txt"
nproc >> "$OUTDIR/kernel.txt"
numactl -H > "$OUTDIR/numa.txt" 2>/dev/null
# 网卡信息
for dev in $(ls /sys/class/net/ | grep -v lo); do
ethtool -i "$dev" > "$OUTDIR/ethtool-$dev.txt" 2>/dev/null
ethtool -g "$dev" >> "$OUTDIR/ethtool-$dev.txt" 2>/dev/null
ethtool -l "$dev" >> "$OUTDIR/ethtool-$dev.txt" 2>/dev/null
ethtool -c "$dev" >> "$OUTDIR/ethtool-$dev.txt" 2>/dev/null
done
# 当前 sysctl
sysctl -a 2>/dev/null | grep -E '^net\.(core|ipv4)\.' > "$OUTDIR/sysctl.txt"
# 中断分布
cat /proc/interrupts > "$OUTDIR/interrupts.txt"
# TCP/UDP 统计快照
nstat -az > "$OUTDIR/nstat.txt"
echo "基线数据已保存到 $OUTDIR/"2.4 环境隔离要点
- 关闭超线程干扰:调优测试时用
isolcpus隔离测试核 - 固定 CPU
频率:
cpupower frequency-set -g performance避免变频干扰 - 网络隔离:使用专用网段,避免背景流量
- 多次测试取中位数:至少 5 次,取 P50 作为基准
三、硬件与驱动层调优
3.1 Ring Buffer 大小
网卡的 ring buffer 决定了驱动可以暂存多少待处理的包。当
CPU 处理不过来时,新包会因 ring buffer
满而被丢弃(ethtool -S 中的
rx_missed_errors)。
# 查看当前和最大 ring buffer 大小
ethtool -g eth0
# Ring parameters for eth0:
# Pre-set maximums:
# RX: 4096
# Current hardware settings:
# RX: 256
# 增大 ring buffer
ethtool -G eth0 rx 4096 tx 4096内核对应:struct net_device
的 ethtool_ops->get_ringparam /
set_ringparam。
副作用:ring buffer 越大,包在 buffer 中等待的时间越长,尾延迟会增加。吞吐场景适合增大,延迟敏感场景需要权衡。
3.2 中断合并(Interrupt Coalescing)
中断合并控制网卡累积多少包或等待多长时间后才触发一次中断:
# 查看当前中断合并参数
ethtool -c eth0
# 调整(微秒)
ethtool -C eth0 rx-usecs 50 rx-frames 64
# 自适应模式(推荐作为起点)
ethtool -C eth0 adaptive-rx on adaptive-tx on内核对应:struct ethtool_coalesce(include/linux/ethtool.h)。
权衡:
| 参数方向 | 效果 | 适合场景 |
|---|---|---|
增大 rx-usecs |
减少中断次数,提高吞吐 | 批量数据传输 |
减小 rx-usecs |
降低中断延迟 | 延迟敏感(交易系统) |
adaptive-rx on |
自动根据负载调整 | 通用场景 |
3.3 RSS 与中断亲和
RSS(Receive Side Scaling)将不同的流分配到不同的网卡队列和 CPU 核心:
# 查看网卡队列数
ethtool -l eth0
# 设置队列数(通常等于 CPU 核心数)
ethtool -L eth0 combined 16
# 查看 RSS hash 配置
ethtool -x eth0
# 设置 RSS hash key 和 indirection table
ethtool -X eth0 equal 16
# 手动设置中断亲和(将队列 N 的中断绑定到 CPU N)
for i in $(seq 0 15); do
IRQ=$(grep "eth0-$i" /proc/interrupts | awk '{print $1}' | tr -d ':')
[ -n "$IRQ" ] && echo $i > /proc/irq/$IRQ/smp_affinity_list
done内核对应:
struct net_device的num_rx_queues/num_tx_queues- RSS hash 通过
netdev_rss_key和 indirection table 实现 - 中断亲和通过
irq_set_affinity_hint()设置
最佳实践:使用 irqbalance
服务自动平衡,或在延迟敏感场景手动绑定,配合
isolcpus
避免业务线程与中断处理竞争同一个核心。
3.4 NUMA 拓扑感知
在多 NUMA 节点的服务器上,网卡通常连接到特定的 NUMA 节点:
# 查看网卡所在的 NUMA 节点
cat /sys/class/net/eth0/device/numa_node
# 查看 NUMA 拓扑
numactl -H
# 将应用绑定到网卡所在的 NUMA 节点
numactl --cpunodebind=0 --membind=0 ./my_server原则:让处理网络包的 CPU 和应用进程都在网卡所在的 NUMA 节点上,避免跨 NUMA 内存访问。跨 NUMA 访问的延迟惩罚通常在 40-100 ns,高频场景下累积影响显著。
四、软中断与 NAPI 调优
4.1 NAPI Budget
NAPI 的 budget 参数控制每次 poll
调用最多处理多少个包:
# 查看当前值
sysctl net.core.netdev_budget # 默认 300
sysctl net.core.netdev_budget_usecs # 默认 2000(微秒)
# 增大(高吞吐场景)
sysctl -w net.core.netdev_budget=600
sysctl -w net.core.netdev_budget_usecs=4000内核对应(include/linux/netdevice.h):
#define NAPI_POLL_WEIGHT 64 /* 单个 NAPI 实例每次 poll 的默认 weight */netdev_budget 是一次
net_rx_action() 软中断中所有 NAPI
实例总共可处理的包数。netdev_budget_usecs
是时间上限。
副作用:budget 越大,单次软中断占用 CPU 越久,可能影响其他任务的调度延迟。
4.2 RPS/RFS
当网卡硬件队列数少于 CPU 核心数时,软件 RPS(Receive Packet Steering)可以将包分发到多个 CPU:
# 启用 RPS(将 CPU 0-7 作为处理核心)
echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus
# RFS 流表大小
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt何时使用 RPS:
- 网卡硬件队列数少于 CPU 核心数
- 无法使用 RSS 的虚拟网卡(如 virtio 只有 1 个队列)
- 需要将中断处理和协议栈处理分到不同的 CPU
何时不使用 RPS:
- 网卡已有足够的硬件队列且 RSS 工作正常
- RPS 引入的 IPI(Inter-Processor Interrupt)开销大于收益
4.3 backlog 队列
netdev_max_backlog 控制每个 CPU 的
input_pkt_queue 最大长度:
# 查看当前值
sysctl net.core.netdev_max_backlog # 默认 1000
# 高包率场景(如 10 Gbps DNS 服务器)
sysctl -w net.core.netdev_max_backlog=5000内核对应(include/linux/netdevice.h):
extern int netdev_max_backlog; /* per-CPU backlog 队列上限 */超过此限制的包会被丢弃,drop_reason 为
CPU_BACKLOG。
4.4 Busy Polling
对于延迟敏感的应用,busy polling 让应用在 socket 读取时直接轮询网卡,跳过中断和软中断:
# 全局启用
sysctl -w net.core.busy_read=50 # 轮询 50 微秒
sysctl -w net.core.busy_poll=50 # select/poll/epoll 轮询 50 微秒
# 或应用层设置
# setsockopt(fd, SOL_SOCKET, SO_BUSY_POLL, &timeout, sizeof(timeout));副作用:busy polling 会持续消耗 CPU,适合延迟优先、CPU 资源充裕的场景。
五、TCP 参数调优
5.1 缓冲区参数
TCP 缓冲区是影响吞吐量的核心参数,对应内核中
struct netns_ipv4 的
sysctl_tcp_rmem[3] 和
sysctl_tcp_wmem[3]:
# TCP 接收缓冲区 [最小值, 默认值, 最大值](字节)
sysctl net.ipv4.tcp_rmem
# 默认:4096 131072 6291456
# TCP 发送缓冲区
sysctl net.ipv4.tcp_wmem
# 默认:4096 16384 4194304
# 高带宽长延迟(BDP 优化)
# BDP = 带宽 × RTT = 10Gbps × 10ms = 12.5 MB
sysctl -w net.ipv4.tcp_rmem="4096 131072 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
# 全局 socket 缓冲区上限
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216内核对应(include/net/netns/ipv4.h:59,73):
int sysctl_tcp_wmem[3]; /* TX 热路径,[min, default, max] */
int sysctl_tcp_rmem[3]; /* RX 热路径,[min, default, max] */自动调优:当
net.ipv4.tcp_moderate_rcvbuf=1(默认开启)时,内核会根据连接的实际
BDP 自动调整接收缓冲区大小,最大不超过
tcp_rmem[2]。
5.2 连接管理参数
# SYN 队列长度(半连接队列)
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
# Accept 队列长度上限
sysctl -w net.core.somaxconn=65535
# 注意:实际 backlog = min(somaxconn, listen() 的 backlog 参数)
# SYN Cookie(防 SYN Flood)
sysctl -w net.ipv4.tcp_syncookies=1 # 默认已开启
# TIME_WAIT 复用
sysctl -w net.ipv4.tcp_tw_reuse=1
# FIN 超时(加速 FIN_WAIT_2 回收)
sysctl -w net.ipv4.tcp_fin_timeout=15 # 默认 60内核对应(include/net/netns/ipv4.h):
| sysctl | 内核字段 | 默认值 |
|---|---|---|
tcp_max_syn_backlog |
sysctl_max_syn_backlog |
128(低配)/ 1024(高配) |
somaxconn |
netns_core.sysctl_somaxconn |
4096 |
tcp_tw_reuse |
sysctl_tcp_tw_reuse |
2(仅 loopback) |
tcp_fin_timeout |
sysctl_tcp_fin_timeout |
60 |
tcp_syncookies |
sysctl_tcp_syncookies |
1 |
5.3 拥塞控制
# 查看可用的拥塞控制算法
sysctl net.ipv4.tcp_available_congestion_control
# 查看/设置当前算法
sysctl net.ipv4.tcp_congestion_control=bbr
# 加载 BBR 模块
modprobe tcp_bbr
# BBR 需要 fq qdisc 配合
tc qdisc replace dev eth0 root fq内核对应(include/net/netns/ipv4.h:200):
const struct tcp_congestion_ops __rcu *tcp_congestion_control;算法选择指南:
| 算法 | 特点 | 适合场景 |
|---|---|---|
| cubic | 基于丢包,Linux 默认 | 低延迟、低丢包网络 |
| bbr | 基于带宽和 RTT 模型 | 高延迟、有随机丢包的广域网 |
| bbr2 | BBR 改进,更公平 | 与 cubic 共存的场景 |
| dctcp | 基于 ECN 标记 | 数据中心内部 |
5.4 TCP Fast Open
# 启用 TFO(客户端+服务端)
sysctl -w net.ipv4.tcp_fastopen=3
# 0=禁用, 1=客户端, 2=服务端, 3=两者
# 应用层需配合 TCP_FASTOPEN socket option内核对应(include/net/netns/ipv4.h:199):
int sysctl_tcp_fastopen;5.5 Keepalive 参数
# 空闲多久开始发送 keepalive 探测
sysctl -w net.ipv4.tcp_keepalive_time=600 # 默认 7200 秒
# 探测间隔
sysctl -w net.ipv4.tcp_keepalive_intvl=30 # 默认 75 秒
# 探测次数(超过后断开)
sysctl -w net.ipv4.tcp_keepalive_probes=5 # 默认 9内核对应(include/net/netns/ipv4.h:153-155):
int sysctl_tcp_keepalive_time;
int sysctl_tcp_keepalive_intvl;
u8 sysctl_tcp_keepalive_probes;六、UDP 与通用 Socket 调优
6.1 UDP 缓冲区
# UDP 接收/发送缓冲区最小值
sysctl net.ipv4.udp_rmem_min # 默认 4096
sysctl net.ipv4.udp_wmem_min # 默认 4096
# 通过全局 socket 缓冲区上限控制
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_default=262144
sysctl -w net.core.wmem_max=16777216内核对应(include/net/netns/ipv4.h:213-214):
int sysctl_udp_wmem_min;
int sysctl_udp_rmem_min;6.2 optmem_max
optmem_max 控制每个 socket 辅助缓冲区(如
cmsg、socket filter)的最大大小:
sysctl -w net.core.optmem_max=81920 # 默认 20480内核对应(include/net/netns/core.h:16):
int sysctl_optmem_max;在使用 recvmmsg() 或大量 socket option
时可能需要增大。
七、qdisc 调优
7.1 默认 qdisc 选择
# 查看当前默认 qdisc
sysctl net.core.default_qdisc
# 高吞吐场景
sysctl -w net.core.default_qdisc=fq_codel
# 配合 BBR 使用
sysctl -w net.core.default_qdisc=fq
# 查看当前 qdisc 状态
tc -s qdisc show dev eth07.2 fq_codel 参数
fq_codel
结合了公平队列和受控延迟,是大多数场景的最佳选择:
# 查看 fq_codel 参数
tc qdisc show dev eth0
# 自定义配置
tc qdisc replace dev eth0 root fq_codel \
limit 10240 \ # 队列总包数上限
target 5ms \ # 目标延迟
interval 100ms \ # 测量窗口
ecn # 启用 ECN 标记7.3 txqueuelen
txqueuelen
是网络设备的默认发送队列长度:
# 查看当前值
ip link show eth0 | grep qlen
# 增大(高吞吐场景)
ip link set dev eth0 txqueuelen 10000八、内存管理调优
8.1 TCP 内存限制
TCP 全局内存由三级限制控制:
# TCP 全局内存限制 [低水位, 压力水位, 高水位](页面数)
sysctl net.ipv4.tcp_mem
# 默认根据系统内存自动计算
# 示例:128 GB 内存服务器
sysctl -w net.ipv4.tcp_mem="786432 1048576 1572864"
# 低水位 = 3 GB, 压力水位 = 4 GB, 高水位 = 6 GB三级含义:
- 低水位以下:TCP 正常分配内存
- 低水位~压力水位:TCP
进入”内存压力”状态,
sk_under_memory_pressure()返回 true,开始限制缓冲区增长 - 压力水位以上:TCP 拒绝新的内存分配,可能丢弃 OFO 队列中的包
8.2 UDP 内存限制
sysctl net.ipv4.udp_mem
# 同样是 [低水位, 压力水位, 高水位](页面数)8.3 socket 级内存
# 单个 socket 接收/发送缓冲区
# 受 net.core.rmem_max 和 net.core.wmem_max 限制
# 应用层通过 setsockopt(SO_RCVBUF/SO_SNDBUF) 设置
# 或通过 setsockopt(SO_RCVBUFFORCE/SO_SNDBUFFORCE) 突破限制(需 CAP_NET_ADMIN)内核对应(include/net/sock.h:415,431):
int sk_rcvbuf; /* 接收缓冲区大小(字节) */
int sk_sndbuf; /* 发送缓冲区大小(字节) */九、场景化调优配置
9.1 高吞吐场景(大文件传输、流媒体)
# 增大缓冲区
sysctl -w net.ipv4.tcp_rmem="4096 524288 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 524288 16777216"
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
# 使用 BBR + fq
sysctl -w net.ipv4.tcp_congestion_control=bbr
sysctl -w net.core.default_qdisc=fq
# 增大 ring buffer 和队列
ethtool -G eth0 rx 4096 tx 4096
ip link set dev eth0 txqueuelen 10000
# 启用 TSO/GSO
ethtool -K eth0 tso on gso on gro on
# NAPI budget
sysctl -w net.core.netdev_budget=6009.2 低延迟场景(交易系统、游戏服务器)
# 小缓冲区减少队列延迟
sysctl -w net.ipv4.tcp_rmem="4096 65536 4194304"
sysctl -w net.ipv4.tcp_wmem="4096 65536 4194304"
# Busy polling
sysctl -w net.core.busy_read=50
sysctl -w net.core.busy_poll=50
# 禁用 Nagle 算法(应用层设置 TCP_NODELAY)
# 减小中断合并延迟
ethtool -C eth0 rx-usecs 0 tx-usecs 0
# 小 ring buffer 减少排队
ethtool -G eth0 rx 512
# CPU 隔离 + 手动中断绑定
# 将网卡中断绑定到特定核心,应用绑定到相邻核心9.3 高并发短连接(Web 服务器、API 网关)
# 增大连接队列
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# 加速 TIME_WAIT 回收
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=15
# 扩大端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# 启用 TFO
sysctl -w net.ipv4.tcp_fastopen=3
# SYN Cookie
sysctl -w net.ipv4.tcp_syncookies=1
# 减少 SYN/SYNACK 重试次数
sysctl -w net.ipv4.tcp_syn_retries=2
sysctl -w net.ipv4.tcp_synack_retries=29.4 数据中心内部(East-West 流量)
# DCTCP 拥塞控制
modprobe tcp_dctcp
sysctl -w net.ipv4.tcp_congestion_control=dctcp
sysctl -w net.ipv4.tcp_ecn=1
# fq_codel + ECN
tc qdisc replace dev eth0 root fq_codel ecn
# 关闭慢启动重启
sysctl -w net.ipv4.tcp_slow_start_after_idle=0
# 早期解复用
sysctl -w net.ipv4.tcp_early_demux=1
sysctl -w net.ipv4.udp_early_demux=1十、调优验证与生产部署
10.1 A/B 对比方法
# 步骤一:基线测量
./baseline.sh
iperf3 -c server -t 60 -P 8 -J > baseline-iperf.json
netperf -H server -t TCP_RR -l 60 > baseline-rr.txt
# 步骤二:应用调优参数
sysctl -p /etc/sysctl.d/90-network-tuning.conf
# 步骤三:调优后测量
./baseline.sh
iperf3 -c server -t 60 -P 8 -J > tuned-iperf.json
netperf -H server -t TCP_RR -l 60 > tuned-rr.txt
# 步骤四:对比
# 吞吐变化、延迟变化、重传率变化、CPU 使用率变化10.2 持久化配置
# 创建 sysctl 配置文件
cat > /etc/sysctl.d/90-network-tuning.conf << 'EOF'
# TCP 缓冲区
net.ipv4.tcp_rmem = 4096 524288 16777216
net.ipv4.tcp_wmem = 4096 524288 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 连接管理
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 拥塞控制
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
# 端口范围
net.ipv4.ip_local_port_range = 1024 65535
EOF
# 应用
sysctl -p /etc/sysctl.d/90-network-tuning.conf10.3 监控告警
调优后需要持续监控关键指标:
# 周期性采集关键指标(写入 Prometheus/Grafana)
while true; do
# TCP 重传率
nstat -az TcpRetransSegs TcpOutSegs 2>/dev/null
# 丢包计数
nstat -az TcpExtListenDrops TcpExtListenOverflows 2>/dev/null
# socket 缓冲区溢出
nstat -az UdpRcvbufErrors UdpSndbufErrors 2>/dev/null
# softirq 时间
cat /proc/softirqs | grep NET_RX
sleep 10
done10.4 回滚预案
生产环境调优务必准备回滚方案:
# 保存当前配置
sysctl -a 2>/dev/null | grep -E '^net\.' > /tmp/sysctl-backup.conf
# 出问题时回滚
sysctl -p /tmp/sysctl-backup.conf
# 对于 ethtool 参数,需要记录原始值
ethtool -g eth0 > /tmp/ethtool-ring-backup.txt
ethtool -c eth0 > /tmp/ethtool-coalesce-backup.txt十一、关键 sysctl 参数速查表
| 参数 | 默认值 | 内核字段 | 影响 |
|---|---|---|---|
net.core.rmem_max |
212992 | 全局 | socket 接收缓冲区上限 |
net.core.wmem_max |
212992 | 全局 | socket 发送缓冲区上限 |
net.core.somaxconn |
4096 | netns_core.sysctl_somaxconn |
Accept 队列上限 |
net.core.netdev_max_backlog |
1000 | netdev_max_backlog |
per-CPU backlog 队列长度 |
net.core.netdev_budget |
300 | netdev_budget |
单次软中断处理包数上限 |
net.ipv4.tcp_rmem |
4096 131072 6291456 | sysctl_tcp_rmem[3] |
TCP 接收缓冲区 |
net.ipv4.tcp_wmem |
4096 16384 4194304 | sysctl_tcp_wmem[3] |
TCP 发送缓冲区 |
net.ipv4.tcp_max_syn_backlog |
128/1024 | sysctl_max_syn_backlog |
SYN 队列长度 |
net.ipv4.tcp_tw_reuse |
2 | sysctl_tcp_tw_reuse |
TIME_WAIT 复用 |
net.ipv4.tcp_fin_timeout |
60 | sysctl_tcp_fin_timeout |
FIN_WAIT_2 超时 |
net.ipv4.tcp_congestion_control |
cubic | tcp_congestion_control |
拥塞控制算法 |
net.ipv4.tcp_fastopen |
1 | sysctl_tcp_fastopen |
TCP Fast Open |
net.ipv4.tcp_keepalive_time |
7200 | sysctl_tcp_keepalive_time |
Keepalive 空闲时间 |
net.ipv4.tcp_syncookies |
1 | sysctl_tcp_syncookies |
SYN Cookie 防护 |
net.ipv4.tcp_slow_start_after_idle |
1 | sysctl_tcp_slow_start_after_idle |
空闲后重启慢启动 |
参考文献
- Linux 内核源码
include/net/netns/ipv4.h:struct netns_ipv4中的所有 TCP sysctl 字段定义 - Linux 内核源码
include/net/netns/core.h:struct netns_core中的核心 sysctl 字段 - Linux 内核源码
include/linux/netdevice.h:NAPI_POLL_WEIGHT、netdev_max_backlog定义 - Linux 内核源码
include/net/sock.h:struct sock的sk_rcvbuf、sk_sndbuf字段 - Linux 内核文档
Documentation/networking/scaling.rst:RSS、RPS、RFS、XPS 机制 - Linux 内核文档
Documentation/admin-guide/sysctl/net.rst:网络 sysctl 参数文档
上一篇:网络丢包定位:从 drop_monitor 到 kfree_skb 追踪
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Linux 网络子系统深度拆解】网络子系统内存管理:sk_buff 分配、page pool 与 NUMA
从内核源码拆解网络子系统的内存管理全貌:sk_buff 分配路径与 slab 缓存、page_pool 页面回收机制、NUMA 感知分配策略、socket 内存记账与反压,以及 bpftrace 可观测实战。
【Linux 网络子系统深度拆解】多队列与流量分发:RSS/RPS/RFS/XPS
单队列网卡的时代早已过去,但多队列本身只是起点——如何把包分到正确的 CPU 上,才是性能的关键。本文从 Linux 6.6 内核源码拆解多队列网络的完整流量分发体系:RSS 硬件哈希与 Toeplitz 算法、RPS 软件多队列模拟与 get_rps_cpu() 路径、RFS 应用感知的 rps_sock_flow_table 机制、XPS 发送端 CPU/队列亲和、aRFS 硬件流表加速,以及 netdev_pick_tx() 发送队列选择逻辑。
【Linux 网络子系统深度拆解】网络丢包定位:从 drop_monitor 到 kfree_skb 追踪
从内核源码拆解 Linux 网络丢包追踪的完整体系:kfree_skb tracepoint 与 80+ 种 drop_reason 枚举、drop_monitor netlink 子系统、dropwatch 工具、perf 丢包记录、bpftrace 丢包聚合脚本,以及生产环境常见丢包点速查表。
【Linux 网络子系统深度拆解】内核网络追踪工具箱:bpftrace/perf/ftrace 实战
从内核 tracepoint 定义出发,系统讲解 bpftrace、perf、ftrace 三大工具在网络诊断中的实战用法:TCP 重传根因分析、softirq 延迟定位、收发包路径延迟剖析、conntrack 表满监控、per-function 火焰图,以及各工具的适用场景与性能开销对比。