max-smtp-msg-rate

<virtual-mta>

Сколько получателей в интервал пробовать со всего этого адреса
в конфигурации это строкаmax-smtp-msg-rate unlimitedвнутри блока <virtual-mta>
То же имя ещё 1:<virtual-mta><virtual-mta-pool>— часть из них другие настройки, часть та же самая
Единственный лимит, который считает адрес целиком

Сколько получателей адрес отправки берётся обслужить за интервал — суммарно, по всем приёмникам сразу. В счёт идут и доставленные письма, и просто попытки: временный отказ приёмника тратит лимит наравне с принятым письмом.

Считает адрес, а не очередь, — и в этом всё отличие. Соседняя по смыслу max-msg-rate живёт в блоке приёмника и действует на одну очередь: 500/h при десяти приёмниках — это пять тысяч писем в час с адреса, а не пятьсот. Здесь наоборот: 500/h означает пятьсот, сколько бы приёмников ни было. Если нужен потолок на адрес как таковой, другого способа его задать нет.

Как выглядит срабатывание. Веб-монитор пишет message rate limit reached (based on max-smtp-msg-rate in configuration) — по тексту сразу видно, какая именно директива придержала отправку, а похожих в этой семье пять. Письма при этом не отказываются и не теряются: лимит растягивает отправку во времени, а не обрезает её.

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

Главная ловушка. В пуле лимит не делится между адресами, а достаётся каждому. Руководство перечисляет директивы, которые пул передаёт вниз, и говорит о них «наследуются адресами-участниками»: max-smtp-msg-rate 100/m в пуле из пяти адресов — это по сотне на каждого, то есть до пятисот в минуту с пула, а не сотня на всех. Значение, записанное в самом адресе, пуловое перекрывает.
Что делает Хаб. Не пишет — ни в адресе, ни в пуле: в пуле у него только список участников. Суточный объём при прогреве Хаб держит сам, своим планировщиком, а MTA отдаёт темп очереди — max-msg-rate 1/h в блоке <domain> внутри адреса. Так сделано осознанно: план прогрева умеет останавливаться по доле спама и подменять адрес из резервного пула, а движковый лимит про это ничего не знает и просто тормозит.

Если ставите руками, держите в голове, что 1/h в блоке приёмника и 1/h здесь — разные величины: первая умножается на число приёмников, вторая нет.

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

Сначала базовый уровень, потом лимит. Это не наша присказка, а прямая рекомендация руководства: пока неизвестно, сколько адрес отправляет без ограничения, любое число окажется либо недостижимым, либо тормозящим без пользы.

Как считать. Возьмите суточный объём, который планируете с этого адреса, и разложите на окно отправки, а не на сутки: три тысячи писем с восьми утра до восьми вечера — это 250/h, а не 125/h. Число здесь ни на что не умножается, поэтому считать проще, чем темп очереди.

Знаменатель принимает множитель. N/[M]единица: 100/15m — сто писем за пятнадцать минут, 83/5s — восемьдесят три за пять секунд. Множитель появился в PowerMTA 5; на более ранних доступно только 100/m. Полезен, когда естественное окно не ложится на минуту или час.

Про 0. Синтаксис допускает его отдельным значением, но что именно он делает, руководство не поясняет — по грамматике это нулевой темп, то есть остановка отправки с адреса. Пробовать стоит на стенде, а не на боевом адресе.

Порядок расчёта — наша рекомендация. Из руководства здесь грамматика значения, умолчание unlimited, счёт попыток наравне с доставками, текст сообщения монитора и совет мерить базовый уровень.
Пример в конфигурации
# два лимита в одном блоке — они про разное
<virtual-mta mta-news-1>
    smtp-source-host 1.2.3.4 news1.example.com
    max-smtp-msg-rate 3000/h    <domain *>
        max-msg-rate 500/h
    </domain>
</virtual-mta>
Нижняя строка — на каждого приёмника: при десяти приёмниках она разрешит пять тысяч писем в час. Верхняя — на весь адрес, и фактическим потолком станет именно она: три тысячи.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Ставят темп адреса так же, как темп очереди

§ 3.3.12.2

Чем чреватоЧисло, взятое из блока приёмника, здесь означает совсем другое: там оно умножалось на количество приёмников, тут не умножается ни на что. Адрес получает лимит во столько раз ниже задуманного, со сколькими приёмниками он работает.
Как заметитьОтправка идёт заметно медленнее расчётной, при этом ни одна отдельная очередь не выглядит придержанной.
Как правильноСчитать от суточного объёма адреса и окна отправки, а не переносить число из блока приёмника. Сверить результат командой, показывающей действующие настройки адреса.

Задают лимит в пуле и считают его общим

§ 3.3.13

Чем чреватоПул раздаёт значение каждому участнику, а не делит между ними. Пул из пяти адресов при 100/m выпускает до пятисот писем в минуту. Добавили шестой адрес — стало шестьсот, хотя конфигурацию не трогали.
Как заметитьСуммарный темп с группы адресов растёт при каждом её пополнении и кратен числу участников.
Как правильноДелить задуманный темп группы на число адресов и писать результат, либо задавать лимит у каждого адреса отдельно. Настоящую границу на весь узел даёт total-max-smtp-out — но она про соединения, а не про темп.

Ограничивают, не сняв базовый уровень

§ 3.3.12.2

Чем чреватоРуководство советует обратное: сперва измерить отправку без лимита. Иначе число берётся с потолка и обычно оказывается либо выше фактического темпа — тогда оно ни на что не влияет, — либо ниже, и тогда замедляет отправку, ничего не улучшая в доставляемости.
Как заметитьПосле ввода лимита доля отказов не изменилась, а очередь стала разгружаться дольше.
Как правильноСнять темп адреса без ограничения хотя бы за сутки, и только потом ставить значение — ниже измеренного, если есть жалобы приёмников, и не трогать, если их нет.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
max-smtp-msg-rate { unlimited | 0 | N/[M]{d|day|h|hr|m|min|s|sec} }
Значения
unlimited · 0 · N/[M] с единицей d|day|h|hr|m|min|s|sec — например 500/h или 100/15m
Умолчание
unlimited § 3.3.12.2
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<virtual-mta>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Пул отдаёт значение каждому участнику как его собственное, значение в самом адресе пуловое перекрывает. Выше пула наследовать не от чего: на уровне узла директива не описана, она живёт только в <virtual-mta> и <virtual-mta-pool>. Подхватывается по pmta reload, перезапуск сервиса не нужен.
Как проверить на узле
Действующее значение — уже после слияния с пулом — печатает отдельная команда. Ею же проверяется, что участнику пула досталось:
pmta show vmta-settings mta-news-1
pmta show vmtas
Первая печатает max-smtp-msg-rate для конкретного адреса, вторая — сводку по всем: сколько получателей и соединений сейчас у каждого. Само срабатывание видно в веб-мониторе строкой message rate limit reached (based on max-smtp-msg-rate in configuration). Хаб снимает сводку по адресам, но не действующие лимиты — их смотреть на узле.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Прогрев адресов · Настроить темп под провайдера