Перейти к содержимому

👻 Прокси группа Smart

Тип прокси группы Smart использует адаптивный выбор узлов на основе весов. Вместо простого round-robin или ручной сортировки она непрерывно отслеживает реальную производительность каждого узла — задержку, процент успешных подключений, объём трафика — и автоматически направляет соединения к наилучшему доступному узлу.


Тип группы smart взят из vernesong/mihomo. Группа сама выбирает узел по весам, которые считаются из реальной работы узлов: задержки, доли успешных подключений и трафика. Можно включить предсказание весов моделью LightGBM.

С v1.19.33 группа также узнаёт, куда ведёт каждый узел и какие сайты ему отказывают:

  • Выход узла. Группа определяет страну и сеть (ASN), из которой выходит трафик узла. Для этого она отправляет через узел запрос к cloudflare.com/cdn-cgi/trace, api.ip.sb или ipwho.is: если один не отвечает, используется следующий.
  • Ответы сайтов. Если сайт отказывает узлу (блокировка по региону, страница ошибки, 403, соединение без ответа), группа запоминает это и ведёт этот сайт через другие узлы.
  • Без поспешных выводов. Регион или сеть отмечаются как недоступные, только если отказали несколько независимых узлов из них. Один отказ ничего не решает, а когда узел снова отвечает, запись снимается.

# Опционально: глобальные настройки LightGBM (на верхнем уровне конфига)
lgbm-auto-update: true
lgbm-update-interval: 72
lgbm-url: "https://github.com/vernesong/mihomo/releases/download/LightGBM-Model/Model.bin"
proxy-groups:
- name: Smart Group
type: smart
proxies:
- Proxy A
- Proxy B
- Proxy C
policy-priority: "Premium:0.9;SG:1.3"
uselightgbm: false
collectdata: false
sample-rate: 1
prefer-asn: true
tolerance: 50

ПараметрТипПо умолчаниюОписание
typestring—Должно быть smart
policy-prioritystring""Множители приоритета по имени узла, см. policy-priority
uselightgbmboolfalseВключить предсказание весов через ML-модель LightGBM
collectdataboolfalseСобирать обучающие данные в CSV для кастомной модели
sample-ratefloat1Доля соединений, которые записывает collectdata, в пределах (0, 1]. Значения вне диапазона (в том числе 0) означают 1, то есть 100%
prefer-asnboolfalseПриоритизировать поиск по ASN при выборе узла
toleranceint0Разница задержки в мс, в пределах которой узлы считаются равными, когда группа выбирает узлы по задержке; см. tolerance

Глобальные параметры LightGBM (верхний уровень)

Заголовок раздела «Глобальные параметры LightGBM (верхний уровень)»

Эти ключи лежат на верхнем уровне конфига; они также описаны на странице Общие настройки.

ПараметрТипПо умолчаниюОписание
lgbm-auto-updateboolfalseАвтоматически обновлять модель LightGBM
lgbm-update-intervalint72Интервал обновления модели в часах
lgbm-urlstringрелиз vernesong LightGBM-Model/Model.binURL для загрузки файла Model.bin

См. также smart-collector-size на странице общих настроек.

ПараметрТипПо умолчаниюОписание
profile.smart-collector-sizefloat100Наибольший размер smart_weight_data.csv в МБ. Это ключ блока profile верхнего уровня, а не группы: в группе он игнорируется

Корректирует вес узлов, чьи имена соответствуют regex-шаблону. Значения меньше 1 снижают приоритет, больше 1 — повышают.

policy-priority: "Premium:0.9;SG:1.3"

В этом примере узлы, соответствующие Premium, получают множитель 0.9 (ниже приоритет), а узлы SG — множитель 1.3 (выше приоритет). Несколько правил разделяются символом ;. Шаблон сначала пробуется как regex; шаблон, который не компилируется как regex, ищется как подстрока. Срабатывает первое совпавшее правило. Двоеточие внутри шаблона экранируется как \: (шаблон от множителя отделяет последнее неэкранированное двоеточие).


Допуск по задержке в миллисекундах, от 0 до 65535. Если не задан или 0, допуска нет.

Обычно группа выбирает узлы по весам, которые она накопила для сайта. Если таких узлов мало, например для сайта, который группа ещё не видела, она добирает остальные узлы по задержке из проверки (url / interval группы). tolerance влияет только на этот порядок:

  • узлы, задержка которых отличается не больше чем на tolerance, считаются равными и остаются в порядке списка proxies;
  • без допуска узлы сортируются строго по задержке, и два узла с 41 и 43 мс могут меняться местами после каждой проверки.

Сначала учитывается policy-priority: узел с более высоким приоритетом остаётся впереди независимо от tolerance. Узлы, которые группа подозревает в блокировке для этого сайта, всегда идут последними.

# строго по задержке (по умолчанию)
tolerance: 0
# узлы с разницей до 50 мс равны, порядок решает список proxies
tolerance: 50
# запас побольше: первые узлы списка остаются впереди, пока они не намного медленнее
tolerance: 150

Группа непрерывно оценивает каждый узел по пяти факторам:

  • Процент успешных подключений — соотношение успехов и неудач; недавние ошибки имеют больший вес.
  • Производительность подключений — время установки соединения и RTT.
  • Статистика использования — объём загрузки/выгрузки и продолжительность сессий.
  • Затухание по времени — веса снижаются для узлов, которые давно не использовались.
  • Тип соединения — отдельные счётчики для UDP и TCP.

Все метрики нормализуются в базовый вес, затем корректируются правилами policy-priority и ASN-специфичными таблицами. Обновление весов происходит через взвешенное усреднение.

Выбор происходит в следующем порядке приоритетов:

  1. История по доменам — если домен назначения уже встречался, предпочитается узел с наилучшей историей для этого домена.
  2. История по ASN — если истории по домену нет, используется прошлая производительность для автономной системы (AS) назначения.
  3. Предвычисленный кеш — горячие домены заранее оцениваются в памяти (LRU) и на диске для быстрого доступа.
  4. Round-robin запасной — используется при недостатке исторических данных; случайное исследование предотвращает локальные оптимумы.

Исторические данные хранятся 7 дней. Устаревшие записи удаляются автоматически.

При превышении порога отказов вес узла штрафуется. Узел, который группа подозревает в блокировке для сайта, откладывается для этого сайта на время — 5 минут при временном сбое, 10 минут по умолчанию, до 30 минут при региональной блокировке, — а затем проверяется снова. Так временный сбой не выключает узел навсегда.


При uselightgbm: true группа использует предобученную модель LightGBM для предсказания весов узлов вместо правилового алгоритма.

Расположение файла модели:

  • Model.bin в рабочей папке ядра (папка -d; имя сравнивается без учёта регистра)

Включите collectdata: true, чтобы записывать метрики подключений в smart_weight_data.csv в рабочей папке ядра.

Используйте sample-rate для снижения нагрузки — например, sample-rate: 0.1 записывает 10% подключений.

Собранный CSV можно использовать для обучения кастомной модели с помощью LightGBM 3.3.5.