web-dev-qa-db-ja.com

SMTPサーバーがメッセージを受け入れるのに30秒以上かかりますが、メッセージを高速化するにはどうすればよいですか?

SMTPサーバーの1つが電子メールの受け入れに時間がかかります。これは、smtpクライアントスクリプトからの一般的な出力(応答時間30秒以上)です。

_2014-02-26 11:44:11 +0800 BEGIN
2014-02-26 11:44:11 +0800 LOGGED IN
2014-02-26 11:44:11 +0800 BEFORE SEND
2014-02-26 11:44:59 +0800 AFTER SEND
2014-02-26 11:44:59 +0800 END
_

Rubyスクリプト:

_message = <<MESSAGE_END
From: One <[email protected]>
To: Two <[email protected]>
Subject: SMTP e-mail test

Testing 123
MESSAGE_END

def timelog(msg)
  puts "#{Time.now} #{msg}"
end

timelog("BEGIN")
Net::SMTP.start(Host, 25, 'localhost', username, password, :plain) do |smtp|
  timelog("LOGGED IN")
  timelog("BEFORE SEND")
  smtp.send_message message, '[email protected]', ['[email protected]']
  timelog("AFTER SEND")
end
timelog("END")
_

どうすればパフォーマンスを向上させることができますか?

更新(DNS時間情報、読み込み中):

_# time Dig yahoo.com mx

; <<>> Dig 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.5 <<>> yahoo.com mx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57858
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;yahoo.com.         IN  MX

;; ANSWER SECTION:
yahoo.com.      528 IN  MX  1 mta7.am0.yahoodns.net.
yahoo.com.      528 IN  MX  1 mta5.am0.yahoodns.net.
yahoo.com.      528 IN  MX  1 mta6.am0.yahoodns.net.

;; Query time: 5 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Mar 21 12:26:09 2014
;; MSG SIZE  rcvd: 106


real        0m1.013s
user        0m0.004s
sys         0m0.004s
_

top、これは新しいサーバーなので、ロードはほとんどありません。

_Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.5%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1903696k total,  1310776k used,   592920k free,   311492k buffers
Swap:  4095992k total,        0k used,  4095992k free,   822692k cached
_

更新(telnet):

_# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 m1.example.com ESMTP Sendmail 8.14.4/8.14.4; Tue, 25 Mar 2014 14:47:04 +0800
HELO 127.0.0.1
250 m1.example.com Hello localhost [127.0.0.1], pleased to meet you
AUTH LOGIN
334 VXNlcm5hbWU6
bWUuY29t
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 2.0.0 OK Authenticated
MAIL FROM: [email protected]
250 2.1.0 [email protected]... Sender ok
RCPT TO: [email protected]
250 2.1.5 [email protected]... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Testing 12345
.
250 2.0.0 s2P6l4Dj012326 Message accepted for delivery
QUIT
221 2.0.0 m1.example.com closing connection
Connection closed by foreign Host.
_

_MAIL FROM_と_RCPT TO_はどちらも、OKが返されるまでに約20秒かかることに注意してください。他のコマンドは即座に応答します。

更新、 FEATURE( 'delay_checks')

FEATURE('delay_checks')を有効にすると、応答時間が30秒以上から約10秒に大幅に改善されます。 〜10秒の遅延は、_MAIL FROM:_と_Sender ok_の間です。

_MAIL FROM: [email protected]
(- 10 second delay -)
250 2.1.0 [email protected]... Sender ok
_

もう一度更新してください。遅延は説明されているものと非常に似ているようです Bryan CostalesによるSendmailの本、258ページ

enter image description here

Dignslookupはすぐに応答するため、DNSの問題ではありません。

_# time nslookup mta5.am0.yahoodns.net
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:   mta5.am0.yahoodns.net
Address: 66.196.118.240
Name:   mta5.am0.yahoodns.net
Address: 98.138.112.34
Name:   mta5.am0.yahoodns.net
Address: 66.196.118.37
Name:   mta5.am0.yahoodns.net
Address: 98.138.112.32
Name:   mta5.am0.yahoodns.net
Address: 98.136.217.203
Name:   mta5.am0.yahoodns.net
Address: 98.138.112.33
Name:   mta5.am0.yahoodns.net
Address: 98.138.112.38
Name:   mta5.am0.yahoodns.net
Address: 63.250.192.46


real        0m1.016s
user        0m0.001s
sys         0m0.006s
_

Sendmail.mcで更新:

_# cat /etc/mail/sendmail.mc | grep -v "^dnl"
divert(-1)dnl
include(`/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID(`setup for linux')dnl
OSTYPE(`linux')dnl
define(`confLOG_LEVEL', `14')dnl
define(`SMART_Host', `mail03.example.com')dnl
define(`confDEF_USER_ID', ``8:12'')dnl
define(`confTO_CONNECT', `1m')dnl
define(`confTRY_NULL_MX_LIST', `True')dnl
define(`confDONT_PROBE_INTERFACES', `True')dnl
define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl
define(`ALIAS_FILE', `/etc/aliases')dnl
define(`STATUS_FILE', `/var/log/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl
define(`confAUTH_OPTIONS', `A y')dnl
define(`confCW_FILE', `/etc/mail/local-Host-names')dnl
define(`confDOMAIN_NAME', `domain.example.com')dnl
define(`confMAX_MESSAGE_SIZE',`23271520')dnl
TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
define(`confTO_QUEUERETURN', `1d')dnl
define(`confTO_IDENT', `0')dnl
FEATURE(`delay_checks')dnl
FEATURE(`no_default_msa', `dnl')dnl
FEATURE(`smrsh', `/usr/sbin/smrsh')dnl
FEATURE(`mailertable', `hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
FEATURE(local_procmail, `', `procmail -t -Y -a $h -d $u')dnl
FEATURE(`access_db', `hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA M=a')dnl
FEATURE(`accept_unresolvable_domains')dnl
LOCAL_DOMAIN(`localhost.localdomain')dnl
MASQUERADE_AS(`example.com')dnl
FEATURE(masquerade_entire_domain)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
_
2
ohho

可能であれば、手動コマンドを実行してSMTPサーバーと対話し、遅延の原因となっているステップを確認することをお勧めします。

これは、コードの実行元と同じマシンから実行する必要があることに注意してください。結果が遅い場合は、別のマシンから同じコマンドを試して、送信元のマシンに関連しているかどうか、または送信元の場所に関係なく同じであるかどうかを確認してください。

• Type: telnet smtp.server.com 25 and hit enter
     The Command will connect to the smtp server on port 25 
     which is used by the SMTP server to communicate
• Type: HELO localhost and hit enter 
     You can type anything instead of localhost like yourdomain.com
• Type: MAIL FROM: [email protected] and hit enter
     Replace [email protected] with your email address
• Type RCPT TO: [email protected] and hit enter
     Replace [email protected] to the email address you want to send the email to
• Type: DATA and hit enter
• Type: this is a test email and hit enter
• Type: . and hit enter
• Type: QUIT and hit enter
4
Jim Scott

設定については何も教えてくれませんが、「ログ」によると、接続時間と封筒処理時間は問題ありません。遅いのはメール本文の処理だけです。

したがって、確率の順に2つの説明があります。

  1. すべての受信メールを処理するメールフィルター(spamassassinなど)があります。これがあなたの問題です。
  2. サーバーのメールキューは、アクセスが非常に遅いネットワーク共有にあります。

さらに手がかりが必要な場合は、SMTP構成の詳細を入力してください:ソフトウェア、構成ファイル、OS構成。

2
Olivier S

「MAILFROM」と次のコマンドの間に遅延が発生しているという事実は、sendmailが送信者アドレスを検証していることを意味します。これはします DNS /ネットワークの問題を強く示唆していますが、手動でのDNSルックアップは問題ないと言っています。このメールサーバーが管理下にあるDNSサーバーを使用している場合、クエリログをオンにして、どのような質問が行われているのか(DNSサーバーが応答するのにかかる時間)を確認できますか?

「SMTPサーバーの1つが電子メールの受け入れに時間がかかっています」とあなたは言います。これは、他のSMTPサーバーがこの動作を示さないことを意味します。そうですか?もしそうなら、これは何が違うのですか?

問題のあるサーバーが本番環境で使用されている場合は、デバッグレベルを上げることができるように、別のポートでリッスンしているsendmailの追加インスタンスを起動してみてください。別の方法は、alxgomzが示唆するようにstraceを使用することです。 telnetを使用して最初の接続を行う場合は、すべてのSMTP接続ではなく、メッセージを処理している子プロセスをstraceするだけで済みます。

0
Paul Haldane

メールサーバーは、送信者アドレスの多くの検証を実行できます。これらの検証のほとんどには、DNSルックアップが含まれます。サーバーでDNSが正しく構成されていない場合、または送信者ドメインが正しく構成されていない場合、これらのDNSルックアップの一部がタイムアウトする可能性があります。クライアントIPの逆引きDNSも、ルックアップがタイムアウトするように誤って構成されている可能性があります。

時々実行される2つのチェックには、他のネットワーク通信が含まれます。

メールサーバーは、クライアントIPアドレスの認証デーモンに接続できます。クライアントが誤って構成されたファイアウォールを使用している場合、ポート113に送信されたSYNパケットは失われます。数回の試行の後、サーバーはあきらめます。

メールサーバーは、送信者ドメインのMXに接続して、送信者アドレスが存在することを検証することもできます。その特定のチェックは、間違って実行すると見事に失敗する可能性があるため、めったに使用されません。

上記のどれが当てはまるかを特定するには、ネットワークトラフィックを検査する必要があります。その検査は、tcpdumpまたはwiresharkを使用して実行できます。

0
kasperd

Sendmailプロセスにstraceを添付して、コマンドから手動でmail fromコマンドを入力することで何ができるかを確認してください(もちろん、その時点で他の誰もSMTPサービスを使用していないことを確認する必要があります。これにより、どの送信者かがわかりやすくなります。チェックが遅いSteveの使い方がわからない場合は、この簡単なブログ投稿が役立つかもしれません(特に第3章と第4章)。

http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace

0
alxgomz