한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

ゲームラグ白書 › L8 ソケットとプロトコル

遅いクライアント(slow consumer)の処理ポリシー Slow-consumer policy

原因ID sk-slow-client · 主担当 ゲーム開発チーム・サーバー開発

図と実験のあるメインページでこのカードを開く →

送るデータがたまり続けるクライアントに対して、サーバーが古い更新を破棄したり接続を切ったりします。

なぜ クライアントの回線が、サーバーが送る量に追いつかない → すると サーバーが古い更新を破棄するか、上限を超えたら接続を切断 → 画面では その人だけワープまたは切断

症状
ワープ, 切断
要因
パケットロス
誰に起きるか
自分だけ
いつ
人が集中したとき
担当
主担当 ゲーム開発チーム・サーバー開発
ゲーム開発チームの対応
送る量を減らす(距離に応じた更新頻度)、品質を下げて送り続ける、カーネルにためておく量を減らす(LinuxのTCP_NOTSENT_LOWAT)。
数値の目安
送信バッファが256KBだと、30KB/sの回線では8秒以上分の送れていないデータがたまります。Linuxはこのバッファを自動で数MBまで大きくすることもあります。
グラフでは
一部だけ高い · 接続ごとのSend-Q、クライアントごとの破棄した更新の数
確認箇所
ゲームサーバーが記録するクライアントごとの送信キューの長さ・破棄した更新の数・切断理由を確認し、サーバーでss -tniを使ってその接続のSend-Qとcwndを合わせて確認
該当する場合
ワープしたり切断されたりした人の接続だけSend-Qがたまり続け、ゲームログにその人の更新の破棄や、送信キューの上限超過による切断が記録されている
該当しない場合
Send-Qが空なのにワープするなら、サーバーの送信側の問題ではない。その人の回線のパケットロス(「無線区間のパケットロス」)か画面の補間側
確認手段
ゲームサーバー・クライアントのログ・メトリクスが必要

出典

  1. IP Sysctl Linux kernel
    tcp_wmem:自動調整される送信バッファの最大値はデフォルト64KB〜4MB(メモリ量による)、tcp_notsent_lowat・TCP_NOTSENT_LOWATでまだ送っていないデータの量を制限
  2. net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
    ssのRecv-Q・Send-Qの値:リッスンソケットではacceptを待っている接続数とbacklogの上限、接続済みソケットではアプリがまだ読んでいないバイト数とACKを受け取っていない送信バイト数

あわせて読みたい原因

同じ層:L8 ソケットとプロトコル

同じ症状(ワープ)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る