タイムアウトに関する Tips

Mobageオープンプラットフォームでは、ユーザーがアプリのGameサーバへアクセスする場合はGadgetサーバを経由してリクエストすることになります。
GadgetサーバとGameサーバ間の通信にはタイムアウトを設定しており、タイムアウト数が一定期間内に閾値を超過した場合はアプリを自動メンテナンスモードに移行します。
自動メンテナンスモードに移行したアプリにユーザはアクセスできなくなります。 
処理フローと閾値の詳細は下記ドキュメントをご参照ください。
 
Mobile アプリ処理フロー概要
SmartphoneWebアプリ処理フロー概要
Shell App Frameworkアプリ処理フロー概要
FAQタイムアウトについて


タイムアウトについて

GadgetサーバからGameサーバへのネットワーク通信にはプラットフォーム全体を保護するためタイムアウトを設けています。
GadgetサーバはGameサーバへの接続開始から5秒を経過すると、RSTパケットを送信して通信を切断しタイムアウトとして加算します。
従ってGameサーバ内の処理やバックエンドへの通信(DB接続やAPIリクエスト)もタイムアウトとして時間が計測される対象に含まれます。
 

タイムアウトの主な原因

サーバ負荷がさほど高くないのにも係わらずタイムアウトが頻発している場合、GadgetサーバとGameサーバ間のネットワークでパケットロスが発生している可能性があります。
ここでは主な原因として下記3点を紹介させていただきます。
 

  • Gameサーバの処理やバックエンド処理が遅くなっている(特定モジュールやslow_queryなどによる原因)
  • Gameサーバからバックエンド間のネットワークに問題が起きている(NW機器トラブルやlocal port枯渇による原因)
  • GadgetサーバとGameサーバ間のネットワークに問題が起きている(WAN側のパケットロスやoutboundNATに起因する問題)


TIME_WAITとSYN再送

TCP通信はソケット単位(IPアドレス+ポート)で行われます。 また、FIN, ACKパケットの送受信を経て正常に通信を終了した場合、
アクティブクローズ側のサーバではソケットが「TIME_WAIT」という状態で一定期間残留します。
GadgetサーバとGameサーバ間の正常な通信では主にGameサーバ側のアクティブクローズになるため、Gameサーバ側に TIME_WAIT 状態のソケットが残ることになります。
TIME_WAIT状態のソケットは前セッションのパケットが遅延して到達するのを待っている状態となります。 その状態のソケットが新セッションのSYNパケットを受信すると、
前セッションの通信と勘違いしてACKパケットで応答してしまうか、 不正パケットの到達として通信を終了するためにRSTパケットで応答してしまうので、正常にTCPハンドシェイクできないという事象が起きます。
Gadgetサーバは外部と通信する場合にいくつかの Global IP にNATしています。 またGameサーバ側もNAT環境であった場合は下記のような構成が想定されます。
 

 
上記のようなNAT環境下においては、異なる複数のGadgetサーバが同一のIPとPortの組み合わせで通信するというケースが発生します。
そのケースにおいて、Gameサーバが上述のような状態であった場合、Gadgetサーバ側から見るとSYNパケットに対して正常にSYN,ACKパケットで応答していないように見えるため TCPハンドシェイクに失敗したと見做し、3秒のwaitの後にSYNパケットの再送が行われます。
この3秒のwaitとSYNパケットの再送がタイムアウト発生の大きな要因となる事例がありますので注意が必要です。 Linuxの主なカーネルのデフォルトではこのTIME_WAIT状態にある期間は60秒となっており、
include/net/tcp.h 中にマジックナンバーとして定義されています。 従ってこのパラメータの変更にはカーネルのリビルドを伴なってしまいますが、なるべく短縮して頂くことを推奨します。
 

ボトルネック調査

ボトルネックを絞り込むためタイムアウトが発生する時間帯にて下記それぞれの tcpdump を取得します。
 

  • GadgetサーバとGameサーバ間の通信
  • Gameサーバとバックエンド間の通信
  • GameサーバとAPIサーバ間の通信
     

    tcpdumpオプション

    -w

    生パケット

    -n

    名前解決しない

    -s

    パケットサイズは1500程度

DeNA IPWatcherについて

プラットフォームとGameサーバ間のネットワーク経路に異常が発生していないか確認するためのリクエストになります。
対象はGadgetXMLに設定いただいているGameサーバに対して定期的にリクエストをおこないます。
ただしDeNA IPWatcherのリクエストが不達であった場合でもタイムアウト数(自動メンテナンスモード)には計測されません。

更新履歴

  • 2014/10/02
    • IPWatcherについて追記
  • 2013/12/13
    • 新規作成

PREVIOUS

チャット設定について

NEXT

TextdataAPIの使い方