转载自Nodeseek

总结了一下, 贴出来一个 /etc/sysctl.conf 供参考. 实测效果良好.

推荐前提环境

Debian 10 / 11 / 12 (推荐有条件的一律升级至 Debian 12, 不用担心占用问题, 384M 内存以上也能运行良好, CentOS 就算了)KVM 虚拟化(LXC 没用过, 不保证可用)384M 以上内存(更低的没有测试, 缓冲区相关配置均和内存相关需要实测)

辅以安装 Xanmod 内核 食用效果更佳.

使用教程

以 root 身份执行, 整段可直接复制. sysctl.conf 由 curl 直接拉取覆盖, 想先看内容可以直接打开 这个链接.

# ===== 1. 安装 Xanmod 内核 (可选, 但推荐) =====
wget -qO - https://dl.xanmod.org/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg

echo 'deb [signed-by=/usr/share/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org releases main' | sudo tee /etc/apt/sources.list.d/xanmod-release.list

apt update && apt install linux-xanmod-x64v3

# ===== 2. 覆盖 /etc/sysctl.conf =====
curl -o /etc/sysctl.conf -fSL https://pan.ccckfg.com/d/Onedrive/%E8%B5%84%E6%BA%90/sysctl.conf

# ===== 3. 生效 (装了新内核需要重启) =====
sysctl -p
reboot

调优原理简述

这份配置的核心思路只有一句话:默认内核参数是为「本地局域网 + 小内存机器」保守设定的,而 VPS 的典型场景是「高延迟跨国链路 + 大量并发短连接」。下面按组说明这些参数分别在解决什么问题。

1. 缓冲区:让带宽延迟积(BDP)装得下

TCP 在一个 RTT 内最多只能有「窗口大小」这么多数据在途,所以单流吞吐上限 ≈ 窗口 ÷ RTT。跨国链路 RTT 常在 150–250ms,要跑满 1Gbps 需要约 1Gbps × 0.2s ÷ 8 ≈ 25MB 的窗口,而默认上限只有几 MB,于是「带宽明明够却跑不满」。把 rmem_max/wmem_maxtcp_rmem/tcp_wmem 的上限抬到 512MB,就是给内核放开自动调窗的天花板——注意这只是上限,内核按需分配,不会真的吃掉这么多内存。tcp_window_scaling 是窗口超过 64KB 的前提(RFC 1323),必须开。

tcp_adv_win_scale=-2 是把接收缓冲区中留给应用层的比例调低、留给协议栈窗口的比例调高(负值表示更激进地用于窗口),代价是应用读取慢时更容易触发丢包。tcp_notsent_lowat 限制「已写入 socket 但尚未发出」的数据量,避免应用把几十 MB 塞进发送队列造成本地排队延迟(bufferbloat)。

2. 队列与 Backlog:削峰,避免瞬时突发被内核直接丢弃

数据包从网卡到应用要经过三级队列:网卡软中断队列(netdev_max_backlog)→ 半连接队列(tcp_max_syn_backlog)→ 全连接队列(somaxconn,实际取它与应用 listen() backlog 的较小值)。任何一级满了,包就被静默丢弃,表现为「偶发连不上、握手超时」。调大是用少量内存换取抗突发能力。tcp_abort_on_overflow=1 则是溢出时直接回 RST 让客户端立刻重试,而不是默默丢弃让它干等一个 RTO。

3. 拥塞控制与 qdisc:BBR 负责「发多快」,fq 负责「怎么发出去」

传统 CUBIC 以丢包作为拥塞信号,而跨国链路的丢包往往来自链路噪声而非真拥塞,一丢包就腰斩窗口,速度直接崩掉。BBR 改为主动测量瓶颈带宽和最小 RTT 来定速,对随机丢包不敏感,这正是它在国际线路上提升明显的原因。fq 是配套的发包调度器:它按流做公平排队并执行 BBR 算出的 pacing 速率,避免整个窗口的数据一次性突发打进链路造成排队和丢包。Xanmod 6.x 已内置 BBRv3,无需再显式指定。

tcp_slow_start_after_idle=0 的原理是:默认情况下连接空闲超过一个 RTO 后拥塞窗口会被重置回初始值、重新慢启动,对长连接(代理、数据库连接池)意味着每次恢复传输都要重新爬坡,关掉即可保住已探测到的带宽。

4. 连接状态回收:把端口和表项尽快还回来

主动关闭方要停留 2MSL(默认 60s)在 TIME_WAIT,用来吸收网络中的迟到报文。高并发短连接下这些残留会耗尽本地端口和 conntrack 表。tcp_tw_reuse=1 借助 tcp_timestamps 的时间戳判断旧报文,从而安全地复用尚在 TIME_WAIT 的端口(只对发起连接的一方生效,所以反代回源同样受益);tcp_fin_timeout、各项 nf_conntrack_tcp_timeout_*tcp_max_tw_buckets 都是同一个思路——缩短占用时间、抬高表容量,防止 nf_conntrack: table full 导致新连接被丢。这也是为什么不开 tcp_syncookies:它靠 hash 免维护半连接队列,代价是丢失 TCP option(窗口缩放、SACK 全部失效),在没有真实 SYN Flood 时是纯粹的性能损失。

5. 丢包恢复与探活:出问题时更快发现、更少重传

tcp_sack 让接收方能精确告知「哪几段收到了」,发送方只补缺失的那几个包,而不是从丢失点起全部重传——高延迟高丢包链路上这是决定性的。tcp_mtu_probing=1 应对的是路径上 ICMP 被墙导致的「PMTU 黑洞」:大包被丢又收不到 ICMP 通知,表现为小请求正常、传大文件必卡死,开启后内核自己二分探测可用 MSS。缩短 tcp_syn_retriestcp_retries2 和 KeepAlive 间隔,则是让失效连接快速失败并交还资源,而不是挂死十几分钟。

6. 内存与文件描述符:给网络栈让路

vm.swappiness=10 降低换出匿名页的倾向——VPS 多为虚拟磁盘,一旦 swap 延迟就雪崩。vm.dirty_ratio=10 限制脏页堆积,避免攒到很大一坨再集中回写造成周期性卡顿。vfs_cache_pressure=250 让内核更积极回收 dentry/inode 缓存,把内存留给应用和 socket 缓冲区(小内存机器尤其需要)。fs.file-maxinotify 上限则是为高并发下的 too many open files 兜底——注意它是系统级上限,进程级还需另行调整 ulimit 或 systemd 的 LimitNOFILE

几点提醒

  • 缓冲区上限与内存强相关,512MB 是为大带宽机器准备的,小内存机器请按实测下调。
  • rp_filter=2(松散模式)在多网卡、策略路由、WARP/隧道分流场景可能误丢包,出问题先改 0 排查。
  • tcp_fack 在 4.x 以后的内核已被 RACK 取代并移除,写了也不会生效,无害但无用。
  • 改完先 sysctl -p 看有无报错,再逐项对比实测;没有普适最优值,抄配置只是起点
赞助MirrorStages Claude Max 直连官方账号直登 Claude Code,不是 API Key 套壳。Opus 5 按真实编码用量折算,一亿 Token 约 58 元。Claude Max 直连Opus 5看我的实测¥58 /亿 Token注册看看
赞助Akile LAX Pro洛杉矶三网优化:电信 CN2 GIA、移动 CMIN2、联通 9929,原生 IP 解锁流媒体。入门款 1C1G / 300G 流量 / 500Mbps。CN2 GIA原生 IP¥43.74 /月起去看看