ゲームラグ白書 › L7 サーバーOS(カーネル)
メモリの回収・コンパクションによる停止 Memory compaction / reclaim stalls (THP)
原因ID so-reclaim · 主担当 インフラチーム・サーバーインフラ · 副担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
OSがヒュージページ(huge page)を作るためにメモリをコンパクションしたり、空きメモリを回収したりしている間、プロセスが止まります。
なぜ 空きメモリが減る、またはヒュージページ機能(THP)がメモリのコンパクションを実行 → すると メモリを要求したスレッドが、回収・コンパクションが終わるまで待機 → 画面では 不規則なサーバーの停止(数ms〜数百ms)
- 症状
- フリーズ, カクつき
- 要因
- ストール
- 誰に起きるか
- サーバー全体
- いつ
- 長時間稼働するほど, ときどきランダムに
- 担当
- 主担当 インフラチーム・サーバーインフラ · 副担当 ゲーム開発チーム・サーバー開発
- ゲーム開発チームの対応
- 実行中の大きなメモリ確保を減らす(起動時にまとめて確保して再利用)。
- インフラチームの対応
- ヒュージページ(THP)は必要な箇所だけで使うように設定(madvise)、空きメモリの基準を引き上げる(vm.min_free_kbytesなど)。
- グラフでは
- 不定期なスパイク · サーバーのティック時間、メモリPSI
- 確認箇所
- /proc/pressure/memoryのsome・full(メモリ待ちで停止した時間の割合)と/proc/vmstatのcompact_stallの増加量をサーバーのティック時間と並べて確認し、/sys/kernel/mm/transparent_hugepage/defragの設定を確認
- 該当する場合
- ティックが跳ねた時刻にメモリPSIが上がり、compact_stallが増える。defragがalways
- 該当しない場合
- PSIとcompact_stallが変わらなければこの原因ではない。スワップの使用量が増えていれば「スワップ」
- 確認手段
- インフラのツールで確認(ゲームコード不要)
出典
- Transparent Hugepage Support Linux kernel
defrag=alwaysだと、THPの確保に失敗したときにその場でメモリの回収・コンパクションを行って停止、madviseでは要求した領域だけがそうなる - Documentation for /proc/sys/vm/ Linux kernel
min_free_kbytes:カーネルが確保しておく最小の空きメモリ(ウォーターマーク)の基準 - PSI - Pressure Stall Information Linux kernel
/proc/pressure/memoryのsome(一部のタスクがメモリ待ちで停止した時間の割合)・full(すべてのタスクが停止した時間の割合)
あわせて読みたい原因
同じ層:L7 サーバーOS(カーネル)
同じ症状(フリーズ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る