ITADN

perf: батчинг iptables-restore вместо ~150 серийных вызовов

#45Pull Requestoviron 创建于 2026-04-30
O
ovironcommented
Поковырял `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 条评论