Четыре способа сказать «медленнее»

критично

rate limits
Четыре величины, три формы у каждой

Замедлить отправку можно четырьмя разными способами, и они считают разное. Понимать, что именно считает выбранный лимит, важнее, чем подобрать число.

Что считает каждый. max-msg-rate — попытки к получателям, причём доставки и отказы наравне. max-data-volume-rate — байты, и только успешно доставленные. Из этой пары получается неочевидное следствие: приёмник, который отказывает, продолжает тратить лимит писем и перестаёт тратить лимит объёма.

Рядом — два способа управлять соединениями. max-smtp-out ограничивает, сколько их открыто одновременно, max-connect-rate — как быстро их открывают. Плюс smtp-out-rampup-interval, который разносит открытие новых соединений во времени, и connection-idle-timeout, который держит простаивающее соединение открытым вместо переподключения.

Грамматика значения общая для всего руководства: N/[M] с единицей d, h, m или s. Множитель в знаменателе позволяет окна, не кратные единице: 10/2h — не то же, что 5/h, потому что по-разному ведёт себя на всплесках. У объёмных лимитов добавляются суффиксы размера: 6g/10h.

И у каждого лимита три формы. Обычная; с приставкой source-ip- — считает на каждый адрес источника отдельно; и с приставкой backoff- — действует вместо обычной, пока очередь в щадящем режиме (backoff-mode). Формы на адрес источника и делают возможным разный темп для нескольких адресов внутри одного блока адреса отправки.

Главная ловушка — забыть, где лимит живёт. Лимиты блока приёмника считают одну очередь, то есть пару «приёмник плюс адрес отправки». max-msg-rate 500/h при десяти приёмниках — это пять тысяч писем в час с адреса, а не пятьсот. Потолок на адрес целиком задают только две директивы блока адреса отправки, max-smtp-msg-rate и max-smtp-data-volume-rate, и других способов нет. Число, перенесённое из блока приёмника в блок адреса или обратно, меняет смысл кратно.
Что делает Хаб. Пишет темп очереди и число соединений из пресета узла: max-msg-rate (2/m, 10/m или 30/m; 500/h, если поле оставили пустым), max-smtp-out, max-msg-per-connection, а при прогреве — свои пониженные значения. Полный набор двойников щадящего режима он тоже пишет (backoff-mode).

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

Формы на адрес источника Хаб не пишет: у него один адрес источника на блок адреса отправки, и разделять внутри блока нечего.

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

Выбор начинается не с числа, а с того, что ограничивать:

Что мешает Каким лимитом Почему не другим
приёмник жалуется на темп max-msg-rate в блоке приёмника считает попытки — то, что видит приёмник
узкий канал, счёт за трафик max-data-volume-rate считает байты, а не письма
приёмник рвёт соединения max-smtp-out одновременность, а не темп
приёмник ругается на частоту подключений max-connect-rate темп открытия, а не число
нужен потолок на адрес целиком max-smtp-msg-rate в блоке адреса лимиты приёмника умножаются на число приёмников

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

Множитель в знаменателе — не украшение. 10/2h и 5/h разрешают одно и то же в сутки, но первое допускает десять писем подряд в начале двухчасового окна, а второе растянет их ровнее. Для приёмника, чувствительного к всплескам, разница заметна.

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

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

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

Переносят число между блоком приёмника и блоком адреса

§ 3.3.10.40

Чем чреватоВ блоке приёмника лимит считает одну очередь и умножается на число приёмников; в блоке адреса — не умножается ни на что. Одно и то же число означает величины, различающиеся в разы.
Как заметитьФактическая отправка кратно выше или ниже расчётной, и кратность равна числу приёмников.
Как правильноСчитать от того, что ограничиваем. Проверять двумя командами: настройки очереди и настройки адреса печатают разные наборы.

Ограничивают трафик лимитом объёма

§ 3.3.10.44

Чем чреватоЛимит объёма считает только успешно доставленные байты. Повторы, оборванные передачи и всё, что ушло в отказ, он не видит — фактический исходящий трафик выходит больше разрешённого, и тем сильнее, чем выше доля отказов.
Как заметитьПровайдер показывает объём выше выставленного потолка, расхождение растёт вместе с отказами.
Как правильноОграничивать канал средствами узла. Лимит объёма — про доставленное, а не про переданное.

Ставят лимит, не сняв базовый уровень

§ 3.3.10.40

Чем чреватоРуководство советует обратное. Число, взятое с потолка, обычно либо выше фактического темпа — и тогда ни на что не влияет, — либо ниже, и тогда замедляет отправку, не улучшая доставляемость.
Как заметитьПосле ввода лимита доля отказов не изменилась, а очередь разгружается дольше.
Как правильноПомерить темп без ограничения хотя бы за сутки и ставить значение ниже измеренного только при жалобах приёмника.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Наследование
Лимиты живут в блоке приёмника и сливаются по обычному правилу: от общего образца к точному, и по уровням — узел, пул, адрес отправки, где самый узкий сильнее. Двойники щадящего режима наследуются так же, но у них есть особенность: без своей строки каждый берёт значение обычного близнеца. Два лимита уровня адреса отправки живут в самом блоке адреса и по приёмникам не делятся.
⇄

Связанные записи

3 связи

Как проверить на узле
Действующие значения — уже после слияния — печатает MTA, и для двух уровней это разные команды:
pmta show settings gmail.com/mta-news-1
pmta show vmta-settings mta-news-1
Первая печатает лимиты очереди: темп, объём, соединения, темп подключений и все их двойники. Вторая — два лимита уровня адреса, которых в первой нет. Само срабатывание видно в веб-мониторе строкой вида message rate limit reached (based on … in configuration) — по имени в скобках сразу понятно, какой из похожих лимитов придержал отправку.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Прогрев адресов · Настроить темп под провайдера
Важность
критично