香港特惠服务器
三网CN2带宽,提供30M至100M大带宽,保障CN2/CMIN2/CU/PCCW四大运营商线路稳定接入

# 绑定中断到本 NUMA 节点的 CPU(示例:绑到 0-7)
apt install irqbalance -y
systemctl stop irqbalance
for i in $(grep eth0 /proc/interrupts | awk '{print $1}' | tr -d ':'); do
echo 0xFF > /proc/irq/$i/smp_affinity # 0-7 的位图,可按需细化
done
# 适度降低中断合并,减少延迟(量化需现场压测)
ethtool -C eth0 adaptive-rx off adaptive-tx off rx-usecs 25 tx-usecs 25
ethtool -K eth0 tso off gso off gro off rxvlan on txvlan on
net.core.netdev_max_backlog = 4096
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_congestion_control = bbr
net.ipv4.ip_local_port_range = 10000 65000
sysctl --system
#!/usr/bin/env bash
set -euo pipefail
IFACE="${IFACE:-eth0}"
# 我们按单口 10G,但留余量给交换机突发与内核调度
# 也可按对端瓶颈设更保守值(例如 8gbit)
EGRESS_CEIL="${EGRESS_CEIL:-10gbit}"
ROOT_RATE="${ROOT_RATE:-8gbit}"
# 清理旧规则
tc qdisc del dev "$IFACE" root 2>/dev/null || true
# Root HTB
tc qdisc add dev "$IFACE" root handle 1: htb default 30
tc class add dev "$IFACE" parent 1: classid 1:1 htb rate "$ROOT_RATE" ceil "$EGRESS_CEIL"
# 战斗高优先:预留+高上限
tc class add dev "$IFACE" parent 1:1 classid 1:10 htb rate 2gbit ceil "$EGRESS_CEIL" prio 0 quantum 1514 burst 64k cburst 64k
tc qdisc add dev "$IFACE" parent 1:10 handle 10: fq_codel limit 1000 target 5ms interval 50ms ecn
# 后台(日志/同步)
tc class add dev "$IFACE" parent 1:1 classid 1:20 htb rate 1gbit ceil 6gbit prio 1 quantum 1514 burst 64k cburst 64k
tc qdisc add dev "$IFACE" parent 1:20 handle 20: fq_codel limit 2000 target 10ms interval 100ms ecn
# 默认兜底
tc class add dev "$IFACE" parent 1:1 classid 1:30 htb rate 500mbit ceil 5gbit prio 2 quantum 1514 burst 64k cburst 64k
tc qdisc add dev "$IFACE" parent 1:30 handle 30: fq_codel limit 4000 target 15ms interval 100ms ecn
# 分类:优先用 fwmark(由 nftables 打标)
# fw filter:handle=0x10 -> 战斗流
tc filter add dev "$IFACE" parent 1: protocol ip prio 1 handle 0x10 fw flowid 1:10
tc filter add dev "$IFACE" parent 1: protocol ipv6 prio 1 handle 0x10 fw flowid 1:10
# 兜底:其余走默认 1:30(无需额外 filter)
echo "[EGRESS] HTB + fq_codel applied on $IFACE"
cat >/etc/nftables.d/moba.nft <<'EOF'
table inet moba {
chain out {
type filter hook output priority 0;
# 战斗 UDP
udp dport 20000-20100 meta mark set 0x10
# (可选)同时设置 DSCP=EF(46)
udp dport 20000-20100 ip dscp set 46
}
chain preroute {
type filter hook prerouting priority 0;
# 入方向也打标,方便 ifb 分类
udp sport 20000-20100 meta mark set 0x10
udp sport 20000-20100 ip dscp set 46
}
}
EOF
# 引入到主配置
grep -q 'include "/etc/nftables.d/*.nft"' /etc/nftables.conf || \
sed -i '1a include "/etc/nftables.d/*.nft"' /etc/nftables.conf
nft -f /etc/nftables.conf
nft list ruleset | grep -A2 'table inet moba'
# ---------- Ingress via ifb ----------
modprobe ifb || true
ip link add ifb0 type ifb 2>/dev/null || true
ip link set dev ifb0 up
# 清理
tc qdisc del dev "$IFACE" ingress 2>/dev/null || true
tc qdisc del dev ifb0 root 2>/dev/null || true
# 把 eth0 的入口挂 ingress,并重定向到 ifb0
tc qdisc add dev "$IFACE" handle ffff: ingress
tc filter add dev "$IFACE" parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0
# 在 ifb0 上做 HTB/fq_codel(入口“自定义节流/排队”)
tc qdisc add dev ifb0 root handle 2: htb default 230
tc class add dev ifb0 parent 2: classid 2:1 htb rate 8gbit ceil 10gbit
tc class add dev ifb0 parent 2:1 classid 2:10 htb rate 2gbit ceil 10gbit prio 0
tc qdisc add dev ifb0 parent 2:10 handle 210: fq_codel limit 1000 target 5ms interval 50ms ecn
tc class add dev ifb0 parent 2:1 classid 2:20 htb rate 1gbit ceil 6gbit prio 1
tc qdisc add dev ifb0 parent 2:20 handle 220: fq_codel limit 2000 target 10ms interval 100ms ecn
tc class add dev ifb0 parent 2:1 classid 2:30 htb rate 500mbit ceil 5gbit prio 2
tc qdisc add dev ifb0 parent 2:30 handle 230: fq_codel limit 4000 target 15ms interval 100ms ecn
# 分类(沿用 nft mark=0x10)
tc filter add dev ifb0 parent 2: protocol ip prio 1 handle 0x10 fw flowid 2:10
tc filter add dev ifb0 parent 2: protocol ipv6 prio 1 handle 0x10 fw flowid 2:10
echo "[INGRESS] ifb0 HTB + fq_codel applied"
[Unit]
Description=TC shaping for MOBA traffic (egress+ingress)
After=network-online.target nftables.service
Wants=network-online.target
[Service]
Type=oneshot
Environment="IFACE=eth0" "EGRESS_CEIL=10gbit" "ROOT_RATE=8gbit"
ExecStart=/usr/local/sbin/tc_moba.sh
ExecStop=/usr/local/sbin/tc_moba_rollback.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
#!/usr/bin/env bash
set -euo pipefail
IFACE="${IFACE:-eth0}"
tc qdisc del dev "$IFACE" root 2>/dev/null || true
tc qdisc del dev "$IFACE" ingress 2>/dev/null || true
tc qdisc del dev ifb0 root 2>/dev/null || true
ip link set ifb0 down 2>/dev/null || true
ip link del ifb0 2>/dev/null || true
echo "[ROLLBACK] All TC/IFB removed."
systemctl daemon-reload
systemctl enable --now tc-moba.service
tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s qdisc show dev ifb0
tc -s class show dev ifb0
| 场景 | 指标 | 上线前 | 上线后 |
|---|---|---|---|
| 合服团战峰值(混有日志/同步) | 战斗 RTT 均值 | 26.8 ms | 24.9 ms |
| 抖动(p95-p50) | 11.3 ms | 4.1 ms | |
| 战斗包丢弃(服务器侧) | 0.12% | 0.02% | |
| 后台同步并发 4 路 | 同步吞吐 | 3.6 Gbps | 3.2 Gbps(略降,预期) |
| NIC 队列 backlog | 峰值 backlog | 18~22ms 等效 | < 6ms |
| 组件 | 参数 | 我们的值 | 说明 |
|---|---|---|---|
| HTB root | rate/ceil |
8G / 10G | 预留抖动空间,避免内核/队列爆顶 |
| 战斗 class | rate/ceil/prio |
2G / 10G / 0 | 小包优先,不做过度限速 |
| fq_codel | target/interval |
5ms / 50ms | 更激进地控制延迟 |
| ifb ingress | 同 egress | 同步配置 | 入口同样拥塞时可控 |
| ethtool coalesce | rx/tx-usecs |
25/25 | 降低延迟的温和值,需结合 CPU |
| offload | tso/gso/gro |
off | 小包业务更稳,吞吐略损 |
| sysctl | netdev_max_backlog |
4096 | 减少过度排队 |
echo "[Check] nft marks:"
nft list ruleset | grep -E "moba|dport 20000"
echo "[Check] egress classes:"
tc -s class show dev eth0 | egrep '1:10|1:20|1:30' -A2
echo "[Check] ingress classes:"
tc -s class show dev ifb0 | egrep '2:10|2:20|2:30' -A2
echo "[Check] live flows (udp 20000-20100):"
ss -uH 'dport = 20000 or dport = 20100' || true
# 1) 基本 nft 打标
nft add table inet moba
nft 'add chain inet moba out { type filter hook output priority 0; }'
nft 'add chain inet moba preroute { type filter hook prerouting priority 0; }'
nft 'add rule inet moba out udp dport 20000-20100 meta mark set 0x10'
nft 'add rule inet moba preroute udp sport 20000-20100 meta mark set 0x10'
# 2) 出口整形(eth0)
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 8gbit ceil 10gbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2gbit ceil 10gbit prio 0
tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel target 5ms interval 50ms ecn
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 500mbit ceil 5gbit prio 2
tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel
tc filter add dev eth0 parent 1: protocol ip handle 0x10 fw flowid 1:10
# 3) 入口整形(ifb0)
modprobe ifb
ip link add ifb0 type ifb
ip link set ifb0 up
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0
tc qdisc add dev ifb0 root handle 2: htb default 230
tc class add dev ifb0 parent 2: classid 2:1 htb rate 8gbit ceil 10gbit
tc class add dev ifb0 parent 2:1 classid 2:10 htb rate 2gbit ceil 10gbit prio 0
tc qdisc add dev ifb0 parent 2:10 handle 210: fq_codel target 5ms interval 50ms ecn
tc filter add dev ifb0 parent 2: protocol ip handle 0x10 fw flowid 2:10