thread-reuse

Global

Оставлять ли завершённые потоки для повторного использования
в конфигурации это строкаthread-reuse true on x86, false on ARMвнутри блока Global
Настройка, которую вендор просит не трогать на ARM

Умолчание зависит от платформы: true на x86 и false на ARM. Это единственная директива, у которой умолчание объявлено по-разному для разных архитектур.

Обычно MTA, закончив работу с потоком, оставляет его для повторного использования. Со значением false потоки выбрасываются сразу.

Зачем это может понадобиться, руководство называет прямо: так обходят внешние неудобства — например, замедление команды top на Linux, которой мешает большое число потоков.

И тут же — две платы за это. Первая: потеря производительности. Вторая тоньше: повторное использование обходит ошибку в старых версиях glibc (до 2.2.2), которая резко сокращает доступную виртуальную память и может обрушить узел, если очередь сильно вырастет.

Про ARM руководство даёт отдельную рекомендацию: не менять умолчание — включение там повышает расход ресурсов и может привести к неустойчивой работе.

Главная ловушка — менять настройку ядра ради удобства наблюдения. Повод, который называет само руководство, — медленная команда top. Плата — производительность и потеря обхода ошибки библиотеки, из-за которой узел может рухнуть при большой очереди.

Размен явно невыгодный, и понять это по описанию непросто: «мешает top» звучит как настоящая проблема, а «обход ошибки glibc до 2.2.2» — как древняя история.

Вторая половина: на ARM руководство просит не трогать умолчание вовсе, и там оно другое. Настройка, скопированная с x86-узла на ARM, попадает ровно в запрещённое.

Что делает Хаб. Не пишет — остаётся умолчание платформы. Узлы парка на x86 — поддерживаемыми Хаб считает только x86_64, — значит потоки переиспользуются.

Строку стоит помнить при переносе конфигурации между узлами разных архитектур: в руководстве это единственная директива, чьё умолчание зависит от платформы, а не от версии MTA.

Рекомендуемые значения

Что ставить. Ответ короткий:

Значение Когда
не писать всегда: умолчание платформы верно для неё
false на x86 только если большое число потоков мешает наблюдению, и вы принимаете обе платы
true на ARM руководство прямо не советует

Если наблюдение мешает — правильнее менять инструмент наблюдения, а не устройство работы узла.

Умолчания по платформам, повод (замедление top), плата производительностью и обход ошибки glibc до 2.2.2, рекомендация не менять на ARM — из руководства, § 3.3.1.38. Оценка размена наша.
Пример в конфигурации
# менять стоит только с пониманием обеих плат
thread-reuse false
На x86 это отключает переиспользование потоков: MTA теряет в производительности и лишается обхода ошибки старой библиотеки. На ARM руководство менять умолчание не советует.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

Типичные ошибки и проблемы

что делают не так и чем это кончается2 ошибки▶

Отключают переиспользование ради удобства наблюдения

§ 3.3.1.38

Чем чреватоУзел теряет в производительности и лишается обхода ошибки старой библиотеки — той, что при большой очереди сокращает доступную память и может обрушить процесс.
Как заметитьСтрока выключена, а причина — «мешала команда просмотра процессов».
Как правильноВернуть умолчание, а наблюдение настроить инструментом, который умеет сворачивать потоки.

Переносят настройку с x86-узла на ARM

§ 3.3.1.38

Чем чреватоУмолчания у платформ разные, и руководство просит не менять значение на ARM: включение повышает расход ресурсов и может привести к неустойчивой работе.
Как заметитьКонфигурация скопирована целиком, узел на ARM ведёт себя хуже прежнего.
Как правильноУбрать строку и оставить умолчание платформы.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · linux
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
thread-reuse <boolean>
Значения
yes | no | true | false
Умолчание
true on x86, false on ARM § 3.3.1.38
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
Global
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Директива пишется в корне файла конфигурации и действует на весь узел: потоки одни на экземпляр. Умолчание при этом зависит от архитектуры — редкий случай, когда «не написано» означает разное на разных машинах.
Как проверить на узле
Строку видно в конфигурации, архитектуру — командой системы:
grep -n 'thread-reuse\|thread-min-priority\|thread-max-priority' /etc/pmta/config
uname -m
Вторая команда важнее первой: умолчание зависит от архитектуры, и одна и та же конфигурация на x86 и на ARM ведёт себя по-разному.
В Хабе
Цена ошибки
опасно: последствия переживут откат
Сценарии
Планирование мощности