用語辞典・エラー・運用

タイムアウト

タイムアウトとは

タイムアウト(timeout)は、決めた待ち時間内に通信や処理が完了せず、打ち切られた状態です。

一つの要求にはDNS検索、接続、TLSハンドシェイク、サーバー処理、最初の1バイト、本文転送など複数の待ち時間があります。「タイムアウトした」だけでは、どの時計が期限を迎えたか分かりません。

待つ側が処理を諦めたことと、相手側の処理が停止したことは同じではありません。中止が伝わらなければサーバーは処理を続ける場合があります。

通信の各段階に別の時計がある処理全体の期限を内側へ配分し、期限超過時は中止と安全な再試行を行う
DNS、接続、TLS、サーバー処理、最初の応答、本文転送の各段階に時計を置き、内側の依存処理へ待ち時間を配分する様子を示すピクトグラム図解
図1処理全体も各中継点も同じ30秒に設定すると、下流の待機が積み重なり、全体の期限を超えて無駄な処理が残ります。

どのタイムアウトかを記録する

DNSリゾルバー応答待ち

サーバーアドレスを得る前の段階です。

接続確立TCP・QUICの接続待ち

経路、ファイアウォール、待受処理、パケット損失が関わります。

TLS安全な通信を始めるための握手を待つ

証明書検証や暗号方式の交渉を含みます。

最初の1バイト要求後の最初の応答待ち

サーバー処理・待ち行列・依存先の遅延を含みます。

読み取り待ち本文途中のデータ待ち

連続通信の全体時間と、データが来ない無通信時間を分けます。

アプリケーション処理・問い合わせ・ロック待ち

ネットワークが正常でも、内部で設定した制限時間により打ち切られます。

408と504

408 要求 Timeoutはサーバーが待っている間に完了要求メッセージを受け取れなかった状態です。504 Gateway Timeoutはゲートウェイが上流サーバーから必要な応答を期限内に得られなかった状態です。

ブラウザー独自の「接続がタイムアウトしました」はHTTP応答を受け取る前の可能性があり、HTTPステータスコードとは限りません。

処理全体の制限時間を内側へ配分する

クライアントが定めた処理全体の期限より、ゲートウェイ、アプリケーション、データベースの期限を少し短くし、エラー応答と後始末の時間を残します。要求を処理する各段階へ残り時間と中止指示を伝え、期限後のクエリーや外部呼び出しを止めます。

タイムアウト値を長くするだけでは、遅い依存処理を抱える接続と処理スレッドが増え、障害を拡大します。正常時パーセンタイル値と利用者の待てる時間から、段階別に決めます。

再試行できるかを判断する

タイムアウト時は相手が処理を完了したか不明です。GET等でも負荷を考え、POST・決済・作成では冪等性鍵や結果照会を使います。バックオフ、待ち時間のばらつき、再試行予算、最大試行回数を設けます。

タイムアウトは「どこかが遅い」ではなく、特定の待機主体が設定した期限を越えた結果です。段階名、経過時間、残り時間、中止の成否、処理結果が確定しているかを記録して診断します。

HTTPの408・504を含むステータスの意味:RFC 9110「HTTP Semantics」

関連用語