简介
前几天发现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
应该能看到刚设置的值。