之前买了一个 DMIT 的小鸡,线路是针对大陆优化的CN2 GiIA,但是使用起来还是感觉有一些断流与延迟,想着以前貌似刷到过相关调试系统的帖子,可以调节流量重传什么的,于是网上搜了搜,大致了解了下,管他有用没用,先试试再说。

下面都是我了解到的一些概念📚:

本指南将深入讲解 Linux TCP 缓冲区的核心概念,并手把手教你结合 BDP(带宽时延积) 理论与 iPerf3 实测数据,科学地调整 net.ipv4.tcp_wmemnet.ipv4.tcp_rmem 参数,找到适合你网络环境的“甜蜜点”,从而大幅提升吞吐量、减少数据重传,让服务器网络性能实现质的飞跃!

1. TCP 发送/接收缓冲区 (wmem & rmem)

  • net.ipv4.tcp_wmem (Write Memory):这是 TCP 发送缓冲区。当应用程序发送数据时,数据会先暂存在这里,然后由内核发送出去,并等待对端的 ACK 确认。如果此缓冲区太小,在“高带宽 × 高延迟”的网络中,发送方会因为缓冲区被迅速填满而频繁暂停,无法持续地向网络管道中输送数据,导致带宽利用率低下。
  • net.ipv4.tcp_rmem (Read Memory):这是 TCP 接收缓冲区。它用于存放从网络中接收到、但尚未被应用程序读取的数据。

这两个内核参数都接受三个整数值,单位为字节 (Byte),其格式为 min default max

  • min:为每个 TCP 连接分配的最小缓冲区大小。这是一个保障值,确保即使在内存压力下也能维持连接。
  • default:默认的缓冲区大小。它会覆盖在 net.core 中定义的全局默认值。
  • max:允许为 TCP 连接自动分配的最大缓冲区大小。这是调优的绝对重点!

2. 单位辨析:别被 b 与 B、MB 与 MiB 迷惑

  • bit (b) vs Byte (B):网络带宽通常以 bps (bits per second) 为单位,而操作系统和文件系统则使用 Byte。请牢记换算关系:1 Byte = 8 bits。因此,100 Mbps 的带宽,其理论最大下载速度是 100 / 8 = 12.5 MB/s
  • MB vs MiB:这是一个长期存在的混淆点。

    • MB (Megabyte):基于十进制1 MB = 1,000,000 Bytes。这通常是硬盘厂商用来计算容量的单位。
    • MiB (Mebibyte):基于二进制1 MiB = 1,024 KiB = 1,048,576 Bytes。操作系统(如 Linux 和 Windows)内部通常使用这个单位,尽管有时界面上可能仍显示为 "MB"。

在本次调优中,将严格使用与内核参数一致的二进制单位 (Bytes, KiB, MiB) 进行计算。

准备工作:工欲善其事,必先利其器 🛠️

在开始调优前,首先确保拥有服务器的 root 权限。没有的话可以不用看了。

1. 检查当前配置 🔍

首先,记录当前的系统配置,运行下面的命令建立个记事本记录下来,万一弄坏了可以恢复。

# 查看当前 TCP 发送缓冲区设置
sysctl net.ipv4.tcp_wmem

# 查看当前 TCP 接收缓冲区设置
sysctl net.ipv4.tcp_rmem

# 查看当前使用的拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

# 查看当前默认的队列调度算法
sysctl net.core.default_qdisc

2. 启用 BBR + FQ(强烈推荐)🔥

现在一般都会开启BBR,系统一般都是自带的,通过命令启用就可以了。

Google 的 BBR 算法通过智能探测瓶颈带宽和往返时间,在高延迟或有轻微丢包的网络环境中,其性能远超传统的 CUBIC 等算法。配合 FQ (Fair Queue) 队列调度,可以实现更高效、更公平的数据包发送。这是一个黄金组合!

如果系统尚未启用,可以通过以下命令添加并持久化配置:

# 将 BBR 和 FQ 的配置写入 sysctl.conf 文件
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf

# 立即应用配置,无需重启
sudo sysctl -p

3. 安装 iPerf3 测试工具 📊

一般需要使用 iPerf3 来精确地测量本地客户端与服务器之间的网络性能,也是验证调优效果的神器。

在服务器 (Linux) 上安装:

# Debian / Ubuntu
sudo apt update && sudo apt install iperf3 -y

# CentOS / RHEL
sudo yum install epel-release -y && sudo yum install iperf3 -y

# Fedora
sudo dnf install iperf3 -y

在客户端 (例如 Windows) 上安装:
iPerf3 官网 下载 Windows 版本,解压后即可在命令行中使用。非常简单!

4. 配置防火墙 🛡️

如果服务器启用了防火墙(如 UFW、firewalld),确保开放 iPerf3 的默认端口 5201

# UFW (Ubuntu/Debian) 示例
sudo ufw allow 5201/tcp

# firewalld (CentOS/RHEL) 示例
sudo firewall-cmd --zone=public --add-port=5201/tcp --permanent
sudo firewall-cmd --reload

实战调优:从理论计算到迭代精调 ⚔️

阶段一:计算理论最优值 (BDP)

调优的起点是计算带宽时延积 (Bandwidth-Delay Product, BDP)。BDP 代表了在网络链路上“飞行”的最大数据量,它也是理论上最优的缓冲区大小。

太长不看,可以直接用别人写好的工具:

TCP 迷之调参

可以用计算出来的值,作为初始值,再慢慢找的适合自己网络的

BDP 公式:
$$BDP \ (Bytes) = \frac{Bandwidth \ (bps) \times RTT \ (s)}{8}$$

如何测量:

  • Bandwidth (带宽): 这是客户端到服务器链路上的瓶颈带宽。例如,如果本地是 500 Mbps 带宽,服务器是 1 Gbps 带宽,那么瓶颈带宽就是 500 Mbps。
  • RTT (往返时间): 从客户端 ping 服务器地址,记录一个稳定的平均值(单位:毫秒 ms)。

计算示例:
假设瓶颈带宽为 500 Mbps,客户端到服务器的 RTT 为 180 ms

  1. 带宽 (bps): 500,000,000
  2. RTT (s): 0.18
  3. BDP (bits): 500,000,000 bps × 0.18 s = 90,000,000 bits
  4. BDP (Bytes): 90,000,000 / 8 = 11,250,000 Bytes

11,250,000 Bytes 就是我们计算出的理论最佳缓冲区大小,也是我们进行实测的初始值。

阶段二:iPerf3 精细迭代(建议在网络晚高峰进行)

理论值是在理想情况下的最优解,但实际网络会受到抖动、少量丢包等因素的影响。因此,需要在网络最繁忙的时段(如晚高峰),通过 iPerf3 进行实测迭代,找到速度与稳定性的最佳平衡点。

核心思路:
从 BDP 计算值开始,通过观察 iPerf3 测试结果中的重传 (Retr) 数量来调整缓冲区大小。

  • 重传数过高 (例如,几百甚至上千):说明缓冲区可能设置得过大。当发生丢包时,过大的窗口会导致大量数据需要重传,反而引起网络拥塞和速度抖动。此时应减小缓冲区。
  • 重传数为零或个位数:说明网络链路质量很好,当前缓冲区设置游刃有余。可以尝试增大缓冲区,以探索更高的速度上限。

操作流程:

  1. 分析结果并迭代:
    观察客户端输出的速度以及 Retr (Retransmits) 字段。
  2. 找到最佳值:
    通过数次迭代,你会找到一个能获得最高稳定速度,同时重传数保持在个位数的“甜蜜点”。为应对网络波动,可以将这个最佳值再稍微减小 0.5-1 MiB 作为最终的保守配置。完美!

如果重传数很低或为零:尝试增加缓冲区 max 值,探索性能极限。例如,增加 2-4 MiB。

# 示例:11,250,000 + 2,097,152 = 13,347,152
sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 13347152"
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 13347152"

重复第 3 步和第 4 步,循环优化。

如果重传数较高:适当减小缓冲区 max 值。例如,减去 1-2 MiB (1 MiB = 1,048,576 Bytes)。

# 示例:11,250,000 - 2,097,152 = 9,152,848
sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 9152848"
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 9152848"

在客户端进行首次测试:

在服务器上设置初始缓冲区大小 (临时生效):
将 BDP 计算值 11250000 作为 max 值,mindefault 保持系统默认或一个较小值即可。

# 我们只调整 max 值,min 和 default 保持内核建议值
# wmem 的 default 为 16384 (16KiB)
# rmem 的 default 为 87380 (85KiB)
sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 11250000"
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 11250000"

在服务器上启动 iPerf3 服务端:

iperf3 -s

打开 cmdPowerShell,进入 iPerf3 所在的本地目录,执行以下命令。主要优化下载(服务器发送),所以使用 -R 参数。

# -c 指定服务器IP
# -R 进行反向测试(下载测试),这会测试服务器的发送性能,对应 wmem
# -t 30 持续测试30秒,以便观察稳定速度和重传
.\iperf3.exe -c your_server_ip -R -t 30

持久化配置:让优化永存 💾

通过 sysctl -w进行的修改在系统重启后会失效。当我们找到满意的参数后,必须将其写入配置文件。

应用配置使其永久生效:

sudo sysctl -p

在文件末尾添加最终参数:
假设最终确定的最佳值为 12298576

# Custom TCP Buffer Settings for High BDP Network
net.ipv4.tcp_wmem = 4096 16384 12298576
net.ipv4.tcp_rmem = 4096 87380 12298576

保存文件并退出 (在 nano 中,按 Ctrl+O,回车,然后 Ctrl+X)。

编辑 /etc/sysctl.conf 文件:

sudo nano /etc/sysctl.conf

至此,TCP 调优已大功告成!可以代理试下,反正我调的重传只有0,也能跑满我本地的200M宽带,但是其他的确实感觉没啥差别,就这样吧,图个心理安慰!

结论 🎯

Linux TCP 性能调优从来不是一个可以“一键完成”的任务,它是一个需要理解原理、借助工具、细心测试的科学过程。直接复制他人的配置参数往往会适得其反,因为每一个网络环境都是独一无二的。个性化调优才是通往极致性能的唯一途径。

最后修改:2025 年 12 月 09 日
如果觉得我的文章对你有用,请随意赞赏