简介

前几天发现frp穿透上传速度比较慢还不稳定,所以找了一些方法,但是都没有什么太大作用

目前发现修改 socket 缓冲区大小这个方法有点用,这里记录一下怎么操作

调大 rmem/wmem(socket 缓冲区大小)其实就是在 内核 TCP 缓冲机制上动手脚,对传输性能会有明显影响。



正面效果

首先说一下正面效果,也就是优点


提升长肥管道的吞吐

高延迟 + 高带宽 的链路(比如跨境、隧道、卫星链路)需要更大的 TCP 窗口才能“装下”足够多的数据包。

否则,RTT 期间的数据太少,带宽利用率不高 → 上传/下载速度被限制。


减少丢包导致的性能下降

较大的缓冲允许更多数据在内核中排队,能吸收突发的流量,降低因为瞬间溢出导致的丢包。


改善隧道/代理(frp、VPN 等)的上传表现

这类程序往往要处理多路复用/转发,如果缓冲太小,很容易成为瓶颈。

负面效果

既然有优点,那么肯定有缺点,如果盲目的调整,过大或者国小都是有影响的


增加延迟(bufferbloat)

缓冲过大时,数据积压在内核队列里,应用层以为“发出去了”,实际上还在等内核慢慢吐。

会导致交互类应用(SSH、游戏、VoIP)延迟变大。


内存占用增加

如果有成千上万个并发连接,每个都能申请几 MB 的缓冲,可能迅速吃掉系统内存。


不能解决带宽不足或物理丢包问题

它只是让 TCP 能“吃得下更多”,但如果线路本身抖动大、丢包多,依然会卡。



调整方法

首先我们可以使用临时调整的方法来测试,找到一个适合的大小,找到后在改成永久的


临时调整

临时调整重启后会失效


最大缓冲限制

sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216

TCP 读写缓冲(最小 / 默认 / 最大)

sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

查看是否生效

sysctl net.core.rmem_max net.core.wmem_max
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem

永久调整

永久调整重启后任然有效


方法一:直接写到 /etc/sysctl.conf

编辑配置文件:

vi /etc/sysctl.conf

在文件末尾加上:

# for frp upload speed
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

保存退出后执行:

sysctl -p

方法二:单独建一个配置文件(推荐)

更干净,方便管理。

vi /etc/sysctl.d/99-frp-tuning.conf

写入:

# frp upload tuning
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

应用配置:

sysctl --system

验证是否生效

sysctl net.core.rmem_max net.core.wmem_max
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem

应该能看到刚设置的值。

二维码

发表评论