Skip to content

perf: file-cache для get_xray_transparent_inbounds#43

Merged
jameszeroX merged 1 commit into
jameszeroX:mainfrom
oviron:perf/inbounds-cache
May 1, 2026
Merged

perf: file-cache для get_xray_transparent_inbounds#43
jameszeroX merged 1 commit into
jameszeroX:mainfrom
oviron:perf/inbounds-cache

Conversation

@oviron
Copy link
Copy Markdown

@oviron oviron commented Apr 30, 2026

Поковырял xkeen -restart на тему ускорения, нашёл несколько независимых моментов, оформил как серию атомарных PR. Каждый можно мерджить отдельно.


get_xray_port_by_mode и get_xray_network_by_mode зовутся в proxy_start 4 раза подряд (redirect/tproxy × port/network). Каждый внутри через дочерний шелл вызывает get_xray_transparent_inbounds, которая форкает strip_json_comments | jq на каждый файл в $directory_xray_config. На 6 json'ах это 8 jq-форков на каждый restart за одними и теми же данными.

Кэш в shell-переменной не работает: caller'ы зовут функцию через port=$(get_xray_port_by_mode redirect), переменные в родительский шелл не пробрасываются. Сделал файловый кэш в /tmp/xkeen-inbounds-cache с инвалидацией по mtime через find -newer, атомарный mv через .tmp.$$. Сбрасывается через _invalidate_inbounds_cache в начале proxy_start для случая когда файл переписан тем же содержимым (mtime не меняется).

KN-3812:

before (patches 1+2): 5.64s avg
after  (+ кэш):       5.01s avg

time user-component упал с 1.30s до 1.06s.

Helper'ы get_xray_port_by_mode и get_xray_network_by_mode зовутся
в proxy_start 4 раза подряд (redirect/tproxy × port/network).
Каждый из них через subshell вызывает get_xray_transparent_inbounds,
который форкает jq+strip_json_comments на каждый файл в
$directory_xray_config. На 2 inbound-файлах это 8 форков jq
просто чтобы получить одни и те же данные.

Shell-variable cache не работает из-за subshell scope (предыдущая
parked попытка perf/xray-inbounds-memoize в этом и упёрлась).
File-cache в /tmp/xkeen-inbounds-cache с invalidation через
find -newer по mtime json-файлов решает проблему: persist
между subshell-ами.

Cache явно сбрасывается в начале proxy_start через
_invalidate_inbounds_cache, чтобы поймать изменения которые
не bump'нут mtime (touch'нули файл с тем же содержимым).
Atomic mv через .tmp.$$ предотвращает partial-cache reads.

Замер на конфиге Hybrid поверх patches 1+2+3:
  before: 5.64s avg
  after:  5.01s avg
  save:   ~0.6s

Cumulative с patches 1-3 от 8.05s baseline: -3.04s (38%).
@jameszeroX
Copy link
Copy Markdown
Owner

Спасибо за доработки. Вы, как всегда, творчески подходите к решению тривиальных задач. Отдельная благодарность за подробное описание объекта доработки до и после, а так же за тесты по итогам.

@jameszeroX jameszeroX merged commit e547768 into jameszeroX:main May 1, 2026
1 check passed
@oviron oviron deleted the perf/inbounds-cache branch May 3, 2026 07:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants