perf: батчинг iptables-restore вместо ~150 серийных вызовов
Поковырял `xkeen -restart` на тему ускорения, нашёл несколько независимых моментов, оформил как серию атомарных PR. Каждый можно мерджить отдельно.
- #41 active-probe вместо sleep в proxy_start и proxy_stop
- #42 параллельная загрузка load_ipset через фоновые задания
- #43 файловый кэш для get_xray_transparent_inbounds
- #44 раскрытие переменных в шелле вместо вызова sed в inject_var
- #46 active-probe вместо sleep 5 в холодном старте netfilter hook
- #47 параллельная загрузка геофайлов в install_geo*
---
Сразу скажу: патч крупнее остальных четырёх, 121/-28 строк в `04_register_init.sh`. Возможно я переусложняю и стоит закрыть. Принёс на подумать.
В `proxy_start` configure_firewall делает ~150 серийных вызовов `iptables -A/-C/-I` и `ip6tables` (add_ipt_rule × 2 семейства + add_prerouting + add_output + dns_redir + user_policies). В busybox каждый это fork+exec, на KN-3812 суммарно около 600ms.
`ipt()` переделан в накопитель: на `-A/-I/-D` пишет строку в одну из 4 переменных по (семейство, таблица), `-S/-L/-nL` и прочее проброс в реальный iptables. `_xkeen_apply_table` собирает `*<table>` + `:$name_chain -` (сброс своей цепочки) + удаление устаревших xkeen-помеченных правил из системных цепочек + накопленные правила + `COMMIT`, и скармливает в `iptables-restore --noflush`. 4 fork+exec вместо ~150.
Один момент: `echo "$user_policies" | while IFS='|' read` заменён на heredoc, из-за пайпа while крутился в дочернем шелле и модификации накопителей в `ipt()` терялись. Heredoc оставляет цикл в родительском шелле.
KN-3812 (Hopper SE, aarch64), Hybrid + xray, 2 inbound, ipv6, ru_exclude ~50k:
```
before (patches 1-4): 4.78s avg
after (1-5): 3.75s avg (3 прогона: 3.62 / 3.91 / 3.71)
```
`iptables-save | grep $comment_tag | sort` до и после деплоя дают байт-идентичный набор (45 v4 + 43 v6).
合并状态:未合并 关闭于 2026-05-01 2 条评论