优化之前先量化。没有数据支撑的调整很可能只是心理作用, 甚至把稳定运行了很久的配置改坏。

先定位瓶颈

# 查看进程资源占用
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-levelwarning降低内存与磁盘 IO
ipv6false(不需要时)减少连接状态
enhanced-modefake-ip显著降低首包延迟
tolerance50 ~ 80减少无谓切换
LimitNOFILE1048576支撑高并发

一次只改一项,观察 24 小时后再决定是否保留。同时改多个参数会让你无法判断哪个起了作用。


优化过程中出现的异常,可对照 12 个常见错误与排查方法

排错 ← 返回教程列表