# iKuai内核性能优化方案

## 1. 背景

iKuai 4.0内核（5.10/6.12）当前配置偏保守，部分性能特性未启用或配置不合理。本文档梳理内核性能相关配置现状，提出优化方案，明确每项改动的范围、影响和风险，供review后分批实施。

## 2. 现状分析

### 2.1 调度器

| 参数 | 当前值 | 问题 |
|------|--------|------|
| CONFIG_HZ | 250（x64/ARM） | 时钟中断频率低，调度延迟最大4ms，网络定时器精度4ms |
| CONFIG_PREEMPT | PREEMPT_NONE | 内核不支持主动抢占，软中断长时间占CPU导致延迟尖峰 |

影响：高并发转发场景下延迟波动大，FQ-CoDel等aqm算法精度受限于HZ。

### 2.2 网络栈

| 参数 | 当前值 | 问题 |
|------|--------|------|
| CONFIG_DEFAULT_TCP_CONG | cubic | BBR已编译但非默认，带宽利用率未最大化 |
| CONFIG_NET_SCH_CAKE | 未启用 | 缺少CAKE qdisc，QoS整形质量不如HTB+fq_codel |
| CONFIG_TCP_CONG_BBR | 启用但非默认 | BBR对高延迟/跨境链路优势明显 |

### 2.3 连接跟踪

| 参数 | 当前值 | 问题 |
|------|--------|------|
| nf_conntrack_max | 51200000 | 5千万条，每条约300字节=15GB内存预留，严重浪费 |
| nf_conntrack_buckets | 未设置 | hash桶数未显式设置，默认值可能不匹配max |
| nf_conntrack_helper | 1 | 自动helper分配有安全风险，现代内核建议关闭 |

### 2.4 网络软中断

| 参数 | 当前值 | 问题 |
|------|--------|------|
| netdev_budget | 600 | 单次NAPI poll处理包数偏低，高吞吐场景CPU软中断频繁 |
| netdev_budget_usecs | 未设置 | 缺少时间限制，配合budget使用更精确 |
| gro_normal_batch | 16 | GRO批量合并值偏小，大流量影响吞吐 |
| netdev_max_backlog | 4096 | 突发场景backlog易满丢包 |
| rmem_max | 4194304 (4MB) | TCP接收窗口上限偏小，万兆高延迟链路不够 |
| wmem_max | 未设置 | 发送窗口上限未设置 |

### 2.5 ARM硬件加速

| 参数 | 当前值 | 问题 |
|------|--------|------|
| CONFIG_NET_MEDIATEK_HNAT | not set | MT7981/7988 PPE硬件转发引擎完全未启用 |
| CONFIG_CPU_FREQ_DEFAULT_GOV | userspace | 不自动调频，未锁最高频 |
| SUPPORT_FAST | 1 | 软加速模式，未启用硬件加速 |

### 2.6 调试/可观测性

| 参数 | 当前值 | 问题 |
|------|--------|------|
| CONFIG_FTRACE | not set | 内核函数跟踪不可用 |
| CONFIG_FUNCTION_TRACER | not set | 函数调用链分析不可用 |
| CONFIG_BPF | 已启用(本次) | eBPF监控/tracing能力已加入 |
| CONFIG_DEBUG_INFO_BTF | 已启用(本次) | BTF type information已加入 |

### 2.7 软加速与netfilter冲突

开启FLOWOFFLOAD后flow跳到快路径，跳过netfilter后续链，导致：
- simple_qos（IP限速）失效 —— filter表IP_QOS链被跳过
- layer7_qos（协议限速）失效 —— mangle表EMARK/IMQ/HTB被跳过

当前修复方案：FASTOFFLOAD链插入RETURN规则，限速flow不offload。改动2个文件20行。

## 3. 改动范围

### 3.1 内核config改动

| 改动项 | 文件 | 旧值 | 新值 | 影响范围 |
|--------|------|------|------|----------|
| HZ | generic + x86/64 + mt7981 | 250 | 1000 | 调度精度、定时器精度 |
| PREEMPT | generic (5.10+6.12) | NONE | VOLUNTARY | 抢占行为，延迟尖峰 |
| TCP默认拥塞控制 | generic (5.10+6.12) | cubic | bbr | TCP发包行为 |
| CAKE qdisc | generic (5.10+6.12) | not set | y | 增加qdisc选项，不改默认qdisc |
| BBR拥塞控制 | generic (5.10+6.12) | not set | y | 编译BBR模块 |
| FTRACE+FUNCTION_TRACER | generic (5.10+6.12) | not set | y | 内核体积增加约2%，调试能力 |
| ARM HNAT | mt7981 config-5.10 | not set | y | MT7981 PPE硬件转发 |
| ARM governor | mt7981 config-5.10 | userspace | performance | CPU始终满频 |

### 3.2 sysctl.conf改动

| 参数 | 旧值 | 新值 | 理由 |
|------|------|------|------|
| netdev_budget | 600 | 3000 | 提高NAPI吞吐 |
| netdev_budget_usecs | — | 8000 | 限制单次poll时间 |
| gro_normal_batch | 16 | 64 | 提高GRO合并效率 |
| netdev_max_backlog | 4096 | 16384 | 减少突发丢包 |
| rmem_max | 4MB | 16MB | 支持万兆高延迟BDP |
| wmem_max | — | 16MB | 同上 |
| rmem_default | — | 256KB | 合理默认值 |
| wmem_default | — | 256KB | 合理默认值 |
| nf_conntrack_max | 51200000 | 262144 | 合理上限，避免内存浪费 |
| nf_conntrack_buckets | — | 65536 | 匹配max（max=4×buckets） |
| nf_conntrack_helper | 1 | 0 | 安全加固 |
| tcp_ecn | 0 | 1 | 启用显式拥塞通知 |

### 3.3 软加速QoS修复（已验证）

| 文件 | 改动 |
|------|------|
| basic.sh | FASTOFFLOAD链加EMARK RETURN（保护layer7_qos） |
| simple_qos.sh | FASTOFFLOAD链加ipset RETURN（保护simple_qos） |

### 3.4 ARM硬件加速

| 文件 | 改动 |
|------|------|
| mt7981 config-5.10 | CONFIG_NET_MEDIATEK_HNAT=y |
| product_config/mt7981-5.10 | SUPPORT_FAST=1→2 |
| hnat.c | per_flow_accounting=true, nf_stat_en=true（MIB计数同步conntrack） |
| DTS | 无需改（Q3000已有hnat节点status=okay） |

## 4. 风险评估

### 4.1 HZ 250→1000

**风险**：CPU功耗略增，时钟中断开销增加。
**影响范围**：全局，所有定时器/调度器行为变化。
**缓解**：x64虚拟化场景功耗不敏感；ARM设备需验证散热。
**回退**：改回CONFIG_HZ=250，重新编译。

### 4.2 PREEMPT_NONE→VOLUNTARY

**风险**：极低。VOLUNTARY只在显式cond_resched()点让出CPU，不影响临界区。
**影响范围**：调度延迟降低，不影响吞吐。
**回退**：改回CONFIG_PREEMPT_NONE=y。

### 4.3 TCP cubic→BBR

**风险**：BBR在特定网络环境（数据中心浅缓冲）可能增加排队延迟。BBR v1对丢包不敏感，可能影响公平性。
**影响范围**：TCP连接的拥塞控制行为。路由器本身主要做转发（不产生大量TCP），影响面在路由器自身的TCP连接（Web管理、下载等）。
**缓解**：转发流量不受影响（conntrack+NAT不涉及拥塞控制）。可保留cubic可选，通过sysctl运行时切换。
**回退**：sysctl net.ipv4.tcp_congestion_control=cubic，无需重编译。

### 4.4 CAKE qdisc

**风险**：极低。CAKE作为可选qdisc编译，不改变默认qdisc行为。
**影响范围**：仅当用户/脚本显式使用CAKE时生效。
**回退**：CONFIG_NET_SCH_CAKE not set。

### 4.5 FTRACE+FUNCTION_TRACER

**风险**：内核体积增加约2-3%。运行时默认关闭，需显式启用才生效。
**影响范围**：仅在echo 1 > /proc/sys/kernel/ftrace_enabled时生效。
**回退**：CONFIG_FTRACE not set。

### 4.6 nf_conntrack_max 51200000→262144

**风险**：中。如果实际环境连接数超过262144，新连接会被丢弃。262144对家用路由器足够（典型家用<10000），企业场景需评估。
**影响范围**：conntrack表容量。当表满时新连接DROP，日志中有"nf_conntrack: table full, dropping packet"。
**缓解**：可通过sysctl运行时调整，无需重编译。监控conntrack使用率，定期评估是否需要调大。
**回退**：sysctl net.netfilter.nf_conntrack_max=51200000。

### 4.7 ARM HNAT

**风险**：中。硬件加速路径行为可能与软件路径不完全一致。已验证软加速QoS修复在硬件加速下同样适用（RETURN规则在FLOWOFFLOAD之前执行）。
**影响范围**：MT7981/7988设备转发路径。
**缓解**：SUPPORT_FAST可运行时切换（1=软加速, 2=硬件加速）。
**回退**：SUPPORT_FAST=1，CONFIG_NET_MEDIATEK_HNAT not set。

### 4.8 软加速QoS修复

**风险**：极低。仅对限速flow跳过offload，非限速flow正常offload。已在Q3000真机验证。
**影响范围**：开启加速时限速功能恢复生效。
**回退**：删除FASTOFFLOAD链的RETURN规则。

## 5. 测试方案

### 5.1 基本功能回归

| 测试项 | 方法 | 通过标准 |
|--------|------|----------|
| Web管理 | 刷机后访问Web界面 | 页面正常加载 |
| SSH | ssh登录 | 正常登录 |
| WAN/LAN | 配置WAN DHCP | 内网可上网 |
| PPPoE | 配置PPPoE拨号 | 拨号成功 |

### 5.2 性能测试

| 测试项 | 方法 | 通过标准 |
|--------|------|----------|
| 转发吞吐 | iperf3打流 | 万兆≥9Gbps, 千兆≥940Mbps |
| 小包性能 | iperf3 -l 64 | 千兆≥1.4Mpps |
| 调度延迟 | cyclictest | max latency < 500us (HZ=1000) |
| conntrack | 高并发连接 | 表使用率正常, 无drop |

### 5.3 功能回归

| 测试项 | 方法 | 通过标准 |
|--------|------|----------|
| IP限速 | 配置simple_qos | 限速生效（加速开启时） |
| 协议限速 | 配置layer7_qos | 限速生效（加速开启时） |
| 流量统计 | 查看统计页面 | 统计数据准确 |
| ARP绑定 | 配置ARP绑定 | 非绑定MAC不可上网 |
| 协议识别 | 查看协议排行 | 协议识别正常 |
| QoS整形 | CAKE替换HTB | 延迟降低, 带宽准确 |

### 5.4 稳定性测试

| 测试项 | 方法 | 时长 | 通过标准 |
|--------|------|------|----------|
| 长时间打流 | iperf3持续打流 | 72h | 无崩溃, 无丢包异常 |
| 高并发 | 大量TCP连接 | 24h | conntrack稳定, 无OOM |
| 断网恢复 | 反复断/连WAN | 100次 | 每次正常恢复 |
| 异常断电 | 强制断电重启 | 50次 | 文件系统正常, 配置不丢 |

### 5.5 ARM专项测试

| 测试项 | 方法 | 通过标准 |
|--------|------|----------|
| HNAT加速 | 查看hnat计数 | offload包计数增长 |
| HNAT+QoS | 开硬件加速+限速 | 限速生效 |
| CPU频率 | cat /proc/cpuinfo | 始终最高频 |
| 温度 | 查看温度 | 72h运行不过热 |

## 6. 实施计划

### 第一批：低风险，已验证

| 改动 | 验证状态 | 回退方式 |
|------|----------|----------|
| 软加速QoS修复 | Q3000真机验证通过 | 删RETURN规则 |
| eBPF+BTF config | x64编译验证通过 | config revert |

### 第二批：中风险，需测试

| 改动 | 验证状态 | 回退方式 |
|------|----------|----------|
| HZ 250→1000 | x64编译通过, 待真机验证 | config revert |
| PREEMPT→VOLUNTARY | x64编译通过, 待真机验证 | config revert |
| sysctl调优 | 需真机验证, conntrack_max可运行时调 | sysctl revert |
| TCP cubic→BBR | 编译通过, sysctl可运行时切换 | sysctl revert |
| CAKE qdisc | 编译通过, 不改默认qdisc | config revert |
| FTRACE | 编译通过, 默认不启用 | config revert |

### 第三批：需专项验证

| 改动 | 验证状态 | 回退方式 |
|------|----------|----------|
| ARM HNAT | 待ARM固件编译完成后Q3000验证 | SUPPORT_FAST=1 |
| ARM governor | 待ARM固件验证 | config revert |

## 7. 分支策略

| 分支 | 内容 | commit |
|------|------|--------|
| feat/x64-5.10-musl | eBPF+BTF config | 已提交 |
| feat/x64-6.12-musl | eBPF+BTF config | 已提交 |
| naixi-hwnat | 软加速QoS修复 | 已提交 |

后续改动按批次在对应分支追加commit，每个改动一个commit，可独立revert。不新开分支。

## 8. 已知局限

1. 网卡驱动内置（IGB/IXGBE/E1000E模块→内置）因iKuai自定义igb-e驱动符号冲突，暂不实施
2. bridge-nf-call-iptables=0（桥接流量不走iptables）保持现状，如需桥接限速后续评估
3. SECURITY_LANDLOCK不加——root不需要沙箱
4. DEBUG_INFO_NONE（6.12）已关闭以支持BTF
