Apacheでのエラー発生とその対処法を考える。
ApacheのErrorLogに次のエラーを検知。

[proxy_ajp:error] [pid 3920:tid 1000] (OS 10060)接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 : AH01030: ajp_ilink_receive() can’t receive header

まずは分解して考えてみる。

proxy_ajp:error

mod_proxy_ajp のことらしい。mod_proxy_ajp は Apache <=> Tomcat の連係モジュール。なので、ここでエラーが発生してるのであろう。ちなみに、Apache-Tomcat連携方法は3方法ぐらいある。違いはこちらのサイトで詳しく解説されている。

(OS 10060)接続済みの呼び出し先が一定の時間を過ぎても…

コードをApacheのsource_codeをGrepしても出てこず。というか、エラーMSG日本語?ということから、OSが返したエラーメッセージっぽい。調べてみると、案の定 socket通信時におけるエラーコードだった。MS Offifical Page

WSAETIMEDOUT (10060)

意味 : 接続がタイムアウトになりました。
説明 : 接続済みの呼び出し先が一定の時間を過ぎても正常に応答しなかったため、接続の試行が失敗したか、接続済みのホストが応答に失敗したため、確立された接続が失敗しました。

再現してみる

ApacheBenchで大量のリクエストを送ったところ簡単に再現。
DBの大量データを入れても同様。
また、テーブルLockしても同様。

ついでにこれらのエラーも出力された。

[proxy_ajp:error] [pid 9136:tid 944] [client ::1:22254] AH00992: ajp_read_header: ajp_ilink_receive failed
[proxy_ajp:error] [pid 9136:tid 936] (70007)The timeout specified has expired: [client ::1:22261] AH00878: read response failed from [::1]:8009 (localhost)

対策

keep alive を on にするとダイジョブウらしい。

参考