优化之前先量化。没有数据支撑的调整很可能只是心理作用, 甚至把稳定运行了很久的配置改坏。
先定位瓶颈
# 查看进程资源占用
top -p $(pgrep clash-meta)
# 持续采样内存
while true; do
ps -o rss= -p $(pgrep clash-meta) | awk '{printf "%.1f MB\n", $1/1024}'
sleep 5
done
# 查看连接数
curl -s -H "Authorization: Bearer your-password" \
http://127.0.0.1:9090/connections | grep -o '"id"' | wc -l
常见瓶颈有三类:内存持续增长、首包延迟高、吞吐上不去。三者对应的优化方向不同。
降低内存占用
- 精简规则数量 —— 十万条规则会占用几十 MB,建议用
RULE-SET外置并按需引用; - 降低日志等级 ——
debug会保留大量历史记录,生产环境用warning即可; - 关闭 IPv6 —— 双栈会额外维护一份连接状态,用不到时设为
ipv6: false; - 限制连接保留时间 —— 及时回收已关闭的连接;
- 减少代理组数量 —— 每个组都会持续测速并维护状态。
log-level: warning
ipv6: false
profile:
store-selected: true
store-fake-ip: true
降低延迟
- 开启 fake-ip —— 省去首包等待解析的时间,效果最明显;
- 规则顺序优化 —— 高频域名放前面,减少逐条比较次数;
- IP 类规则加
no-resolve—— 避免为了比对而触发额外解析; - DNS 就近选择 —— 国内域名用国内解析器,国外域名走加密解析;
- 避免多层代理 —— 链路每多一跳,延迟就多一次往返。
dns:
enable: true
enhanced-mode: fake-ip
cache-algorithm: arc # 提升缓存命中率
prefer-h3: false
nameserver:
- https://doh.pub/dns-query
fallback:
- https://1.1.1.1/dns-query
提升吞吐
- 关闭 TUN 的额外栈开销 —— 优先使用
system栈; - 调整 MTU —— 过小会造成分片,测试后可适当调大;
- 提高文件描述符上限 —— 高并发场景下这是硬性限制;
- 选择合适的节点 —— 带宽比延迟更能决定下载速度。
# systemd 服务中放宽文件描述符
[Service]
LimitNOFILE=1048576
# 内核侧的 UDP 超时
tun:
mtu: 9000
udp-timeout: 300
系统层调优
# 增大连接队列与端口范围
net.core.somaxconn = 8192
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 10240 65000
# 更积极的 TCP 行为
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0
写入 /etc/sysctl.d/99-clash-tuning.conf 后执行 sysctl --system 生效。
推荐参数清单
| 项目 | 推荐值 | 收益 |
|---|---|---|
log-level | warning | 降低内存与磁盘 IO |
ipv6 | false(不需要时) | 减少连接状态 |
enhanced-mode | fake-ip | 显著降低首包延迟 |
tolerance | 50 ~ 80 | 减少无谓切换 |
LimitNOFILE | 1048576 | 支撑高并发 |
一次只改一项,观察 24 小时后再决定是否保留。同时改多个参数会让你无法判断哪个起了作用。
优化过程中出现的异常,可对照 12 个常见错误与排查方法。
排错
← 返回教程列表