2025-07-20 · linux / networking
【Linux 网络子系统深度拆解】网络子系统内存管理:sk_buff 分配、page pool 与 NUMA
从内核源码拆解网络子系统的内存管理全貌:sk_buff 分配路径与 slab 缓存、page_pool 页面回收机制、NUMA 感知分配策略、socket 内存记账与反压,以及 bpftrace 可观测实战。
























网络调优是一门需要方法论支撑的工程实践。盲目修改 sysctl 参数不仅可能无效,还可能引入新问题——例如,增大 TCP 接收缓冲区可能缓解吞吐不足,却在高并发场景下耗尽内存触发 OOM。本文建立一套系统化的调优框架:先用基准测试建立性能基线,再通过可观测工具定位瓶颈层次,然后针对性地调整参数,最后通过 A/B 对比验证效果。每个 sysctl 参数都会对应到内核源码中的数据结构,让你理解”为什么这样调”。
阶段一:基线测量
↓ 建立当前性能数据(吞吐、延迟、丢包率、CPU 使用率)
阶段二:瓶颈定位
↓ 通过可观测工具确定瓶颈在哪一层
阶段三:参数调整
↓ 针对瓶颈层次修改相应参数
阶段四:效果验证
→ 对比调优前后的性能数据,确认改善且无副作用
网络性能瓶颈按从底层到上层可分为:
| 层次 | 瓶颈表现 | 诊断方法 | 调优手段 |
|---|---|---|---|
| 硬件/驱动 | 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、批处理 |
# 服务端
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(重传次数)、Cwnd# 安装
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/Rate#!/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/"isolcpus 隔离测试核cpupower frequency-set -g performance
避免变频干扰网卡的 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 中等待的时间越长,尾延迟会增加。吞吐场景适合增大,延迟敏感场景需要权衡。
中断合并控制网卡累积多少包或等待多长时间后才触发一次中断:
# 查看当前中断合并参数
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 |
自动根据负载调整 | 通用场景 |
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_queuesnetdev_rss_key 和 indirection
table 实现irq_set_affinity_hint()
设置最佳实践:使用 irqbalance
服务自动平衡,或在延迟敏感场景手动绑定,配合
isolcpus
避免业务线程与中断处理竞争同一个核心。
在多 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 的 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 越久,可能影响其他任务的调度延迟。
当网卡硬件队列数少于 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:
何时不使用 RPS:
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。
对于延迟敏感的应用,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 缓冲区是影响吞吐量的核心参数,对应内核中
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]。
# 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 |
# 查看可用的拥塞控制算法
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 标记 | 数据中心内部 |
# 启用 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;# 空闲多久开始发送 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 接收/发送缓冲区最小值
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;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
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 eth0fq_codel
结合了公平队列和受控延迟,是大多数场景的最佳选择:
# 查看 fq_codel 参数
tc qdisc show dev eth0
# 自定义配置
tc qdisc replace dev eth0 root fq_codel \
limit 10240 \ # 队列总包数上限
target 5ms \ # 目标延迟
interval 100ms \ # 测量窗口
ecn # 启用 ECN 标记txqueuelen
是网络设备的默认发送队列长度:
# 查看当前值
ip link show eth0 | grep qlen
# 增大(高吞吐场景)
ip link set dev eth0 txqueuelen 10000TCP 全局内存由三级限制控制:
# TCP 全局内存限制 [低水位, 压力水位, 高水位](页面数)
sysctl net.ipv4.tcp_mem
# 默认根据系统内存自动计算
# 示例:128 GB 内存服务器
sysctl -w net.ipv4.tcp_mem="786432 1048576 1572864"
# 低水位 = 3 GB, 压力水位 = 4 GB, 高水位 = 6 GB三级含义:
sk_under_memory_pressure()
返回 true,开始限制缓冲区增长sysctl net.ipv4.udp_mem
# 同样是 [低水位, 压力水位, 高水位](页面数)# 单个 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; /* 发送缓冲区大小(字节) */# 增大缓冲区
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=600# 小缓冲区减少队列延迟
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 隔离 + 手动中断绑定
# 将网卡中断绑定到特定核心,应用绑定到相邻核心# 增大连接队列
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=2# 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# 步骤一:基线测量
./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 使用率变化# 创建 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.conf调优后需要持续监控关键指标:
# 周期性采集关键指标(写入 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
done生产环境调优务必准备回滚方案:
# 保存当前配置
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| 参数 | 默认值 | 内核字段 | 影响 |
|---|---|---|---|
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 |
空闲后重启慢启动 |
include/net/netns/ipv4.h:struct netns_ipv4
中的所有 TCP sysctl 字段定义include/net/netns/core.h:struct netns_core
中的核心 sysctl 字段include/linux/netdevice.h:NAPI_POLL_WEIGHT、netdev_max_backlog
定义include/net/sock.h:struct sock 的
sk_rcvbuf、sk_sndbuf 字段Documentation/networking/scaling.rst:RSS、RPS、RFS、XPS
机制Documentation/admin-guide/sysctl/net.rst:网络
sysctl 参数文档上一篇:网络丢包定位:从 drop_monitor 到 kfree_skb 追踪
把当前热点继续串成多页阅读,而不是停在单篇消费。
2025-07-20 · linux / networking
从内核源码拆解网络子系统的内存管理全貌:sk_buff 分配路径与 slab 缓存、page_pool 页面回收机制、NUMA 感知分配策略、socket 内存记账与反压,以及 bpftrace 可观测实战。
2026-04-27 · linux / networking
单队列网卡的时代早已过去,但多队列本身只是起点——如何把包分到正确的 CPU 上,才是性能的关键。本文从 Linux 6.6 内核源码拆解多队列网络的完整流量分发体系:RSS 硬件哈希与 Toeplitz 算法、RPS 软件多队列模拟与 get_rps_cpu() 路径、RFS 应用感知的 rps_sock_flow_table 机制、XPS 发送端 CPU/队列亲和、aRFS 硬件流表加速,以及 netdev_pick_tx() 发送队列选择逻辑。
2025-07-24 · linux / networking
从内核源码拆解 Linux 网络丢包追踪的完整体系:kfree_skb tracepoint 与 80+ 种 drop_reason 枚举、drop_monitor netlink 子系统、dropwatch 工具、perf 丢包记录、bpftrace 丢包聚合脚本,以及生产环境常见丢包点速查表。
2025-07-23 · linux / networking
从内核 tracepoint 定义出发,系统讲解 bpftrace、perf、ftrace 三大工具在网络诊断中的实战用法:TCP 重传根因分析、softirq 延迟定位、收发包路径延迟剖析、conntrack 表满监控、per-function 火焰图,以及各工具的适用场景与性能开销对比。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。