ゲームラグ白書 › 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が空なのにワープするなら、サーバーの送信側の問題ではない。その人の回線のパケットロス(「無線区間のパケットロス」)か画面の補間側
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- IP Sysctl Linux kernel
tcp_wmem:自動調整される送信バッファの最大値はデフォルト64KB〜4MB(メモリ量による)、tcp_notsent_lowat・TCP_NOTSENT_LOWATでまだ送っていないデータの量を制限 - net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
ssのRecv-Q・Send-Qの値:リッスンソケットではacceptを待っている接続数とbacklogの上限、接続済みソケットではアプリがまだ読んでいないバイト数とACKを受け取っていない送信バイト数
あわせて読みたい原因
同じ層:L8 ソケットとプロトコル
同じ症状(ワープ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る