Тормозит отправка почты? Диагностика и исправление

· На чтение уйдёт 2 минуты · (365 слов)

Целый час как последний болван решал проблему с медленной отправкой почты. Дело в том, что на одном из серверов Берсерка на регистрацию игрока внезапно стало уходить по 20 секунд. Скриптам, выводящим результат в браузер, это очень не нравилось, и они, как и должен поступать порядочный скрипт, советовали игрокам обратиться в службу тех. поддержки.

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

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

Первое, что я сделал - на всякий случай заменил mynetworks в Postfix. Дабы не выполнялось никаких правил по проверке адресов, заголовков и т.п. Не помогло. Следующим этапом - посмотрел mailq. Одно несчастное сообщение со статусом timed out. Ну что же, двигаемся дальше.

Увеличил количество потоков игрового сервера вдвое. Число увеличилось, скорость отправки не изменилась.

Собственное письмо, отправляемое через telnet, между тем отсылалось со скоростью света:

HELO localhost
MAIL FROM:<support@berserk-online>
RCPT TO:<testing@testing.ru>
DATA
Subject: Chto eto takoe? Huy huy huy
From: BaRoN <support@berserk-online>
Huy Huy Huy
.

Очень важно не забыть про заключительную одинокую точку - это сигнал к отправке письма, - он говорит о том, что секция DATA закончилась.

Aug 27 12:58:36 opteron05 postfix/smtpd[26457]: connect from localhost[127.0.0.1]
Aug 27 12:58:51 opteron05 postfix/smtpd[26457]: DE346181E94E: client=localhost[127.0.0.1]

Еще примерно 20-30 минут я не мог понять, что именно не так. пока до меня не дошло, что если вторая строчка появляется при наборе текста вручную через миллисекунды, а при отправке почты сервером - через секунды, - значит дело в самом сервере

Все оказалось и просто и сложно одновременно, вот так выглядит код отправки SMTP сообщения (собственная поделка):

      String host = InetAddress.getLocalHost().getHostName();
      send.print("HELO " + host + CRLF);
      send.flush();

Само собой, try, catch и куча мусора были жестоко вырезаны. Вместе с тем, введя в командной строке host 127.0.0.1, ответ я получал практически мгновенно. Но решение пришло. Проверив оба DNS адреса из /etc/resolv.conf, я выяснил, что один из них - “совсем сломался”. Для этого использовалась команда host 127.0.0.1 192.168.20.2, где 192.168.20.2 - адрес сломавшегося внутреннего сервера.

Ставим вместо бракованного внутреннего небракованный внешний сервер, жалуемся админам сетки на слетевший DNS и дело в шляпе. Регистрация в игре вновь занимает примерно 0.3 секунды.

Полезное