====== Тюнинг Syncthing на слабом железе ====== ===== Глобальные опции ===== ^ Параметр ^ Дефолт ^ Значение для слабого железа ^ Причина ^ | maxFolderConcurrency | 0 (все папки разом) | 1 | не хэшировать несколько папок параллельно — источник пиковой памяти | | progressUpdateIntervalS | 5 | -1 | не тратить память/CPU на прогресс передачи | | maxConcurrentIncomingRequestKiB | 0 (unlimited) | 32768 | ограничить буфер входящих запросов | 1 -1 32768 ===== Настройки на уровне папки ===== ^ Параметр ^ Дефолт ^ Значение для слабого железа ^ Причина ^ | hashers | 0 (auto = число ядер) | 1 | меньше пиковой памяти при хэшировании крупных файлов | | copiers | 0 | 1 | то же для копирования при синхронизации | | pullerMaxPendingKiB | 0 (unlimited) | 16384 | ограничить буфер на pull | | scanProgressIntervalS | 0 | -1 | не тратить память/CPU на прогресс сканирования | 1 1 16384 -1 ===== Параметры, которые не снижать (общий случай) ===== ^ Параметр ^ Почему не трогать ^ | numConnections (на устройство) | Прямой trade-off с throughput. Если устройство — основной партнёр по передаче больших объёмов, снижение до 1 ощутимо замедляет передачу. Значение выше дефолта на конкретном устройстве обычно выставлено намеренно. | ===== fsWatcher на BSD: отдельный случай ===== Официальная рекомендация Syncthing — держать `fsWatcherEnabled` включённым (live-нотификации дешевле, чем полное периодическое пересканирование). Это верно для Linux (inotify — одна рекурсивная подписка на дерево) и для папок с разумным числом файлов. На FreeBSD/BSD `fsWatcher` реализован через kqueue, который **не поддерживает рекурсивное наблюдение** — библиотека (`github.com/syncthing/notify`) вынуждена открывать отдельный watch (и держать отдельный vnode) на **каждую** директорию дерева. Для папки с сотнями тысяч мелких вложенных директорий (типичная раскладка `receive-encrypted` — блоки хранятся как хэш-шардированное дерево) это означает сопоставимое число живых vnode и watch-дескрипторов, что на системе с ограниченным `kern.maxvnodes` может спровоцировать агрессивный vnode-реклейм — блокирующий, системный, а не только для процесса Syncthing. Диагностический признак: в heap-профиле процесса (support bundle → `.pprof`, смотреть через `go tool pprof`) большая доля памяти уходит на `github.com/syncthing/notify.*` (`node.addchild`, `kq.Record`, `watchpoint.Add`) вместо полезных данных синхронизации. ^ Условие ^ Рекомендация ^ | Linux, любой размер папки | `fsWatcherEnabled=true` — штатная рекомендация верна | | BSD/kqueue, папка с умеренным числом файлов | `fsWatcherEnabled=true` — штатная рекомендация верна | | BSD/kqueue, папка с сотнями тысяч файлов/директорий (в т.ч. `receive-encrypted`), особенно **receive-only** (локальных изменений на этом хосте не бывает — их и незачем ловить fsWatcher'ом) | `fsWatcherEnabled=false` + разумный `rescanIntervalS` вместо live-наблюдения | Для sendreceive-папки с реальными локальными изменениями (например, что-то пишет в неё сторонний процесс напрямую по SMB) — `rescanIntervalS` подобрать под частоту появления этих изменений, а не под дефолт: если новые файлы предсказуемо приходят раз в сутки, суточный рескан ловит их с разумной задержкой без постоянно открытого watch-дерева.