Узел, который вежливо отказывает вместо падения

Отказать на входе дешевле, чем упасть под нагрузкой

Задача. Узел на VDS, где ресурсы делятся с чужими машинами, и главная беда — зависший MTA, о котором предупреждает раздел о виртуализации.

Из чего складывается:

  • max-memory-usage-percent — при превышении доли памяти отвечает 452 на MAIL FROM, пока расход не опустится;
  • spool-max-recipients — потолок получателей в очередях: сверх него подача отбивается временной ошибкой;
  • total-max-smtp-out — общий предел исходящих соединений, а с ним дескрипторов и памяти на соединения.

Области у составляющих разные. Все три — уровня узла.

Как они взаимодействуют. Две строки следят за одним ресурсом с разных сторон — посчитанные получатели против измеренной памяти, — а третья задаёт, как быстро этот ресурс расходуется. Руководство не подаёт их набором: группировка наша.

Главная ловушка — оставить порог памяти по умолчанию. Значение 100 выключает проверку: узел принимает почту, пока память не кончится, и вместо временного отказа подающим получается зависший MTA.
Что делает Хаб. Применяет одну составляющую из трёх: total-max-smtp-out 5000 в основном файле конфигурации. Порога памяти и потолка получателей нет — действуют умолчания MTA, а умолчание порога памяти, 100, проверку выключает.
Рекомендуемые значения

Три строки:

Строка Умолчание Что задать
max-memory-usage-percent 100 — проверка выключена с запасом, например 75
spool-max-recipients auto — по ресурсам машины auto, пока нет замеренной причины
total-max-smtp-out 1200 на Enterprise, 200 на Standard по ресурсам узла, в пределах лицензии
Поведение и умолчания — из руководства (§ 3.3.1.50, § 3.3.1.8, § 3.3.1.2); предупреждение о зависании на виртуальной машине — § 2.5. Группировка — наша гипотеза.
Пример в конфигурации
max-memory-usage-percent 75
spool-max-recipients autototal-max-smtp-out 1200
Порог 75 — из примера руководства; при превышении подающие получают 452 4.3.2 Server resources temporarily exhausted и повторяют позже.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Проверить, какие пределы действуют на узле:
grep -n 'max-memory-usage-percent\|spool-max-recipients\|total-max-smtp-out' /etc/pmta/config
pmta show status
Нет строки порога памяти — действует 100, и проверка выключена; show status покажет получателей в очередях и соединения.