ゲームラグ白書 › L7 サーバーOS(カーネル)
OS・カーネル・ドライバー・ファームウェアのアップデート後の性能変化 Performance regression after OS / kernel / driver / firmware update
原因ID so-os-update · 主担当 インフラチーム・サーバーインフラ
図と実験のあるメインページでこのカードを開く →
ゲームのコードは変わっていないのに、サーバーのOS・カーネル・ドライバー・ファームウェアをアップデートしてから遅くなるケースです。アップデートによって、デフォルト値、スケジューラー、CPU脆弱性の緩和策(mitigations)、ドライバーの動作が変わることがあります。
なぜ 定期的なセキュリティパッチや新しいサーバーイメージで、カーネル・ドライバー・ファームウェアが変わる → すると デフォルト値やスケジューラーが変わったり新しい脆弱性の緩和策が有効になったりして、同じ処理により多くのCPU時間がかかり、スレッドにCPUが割り当てられる順序も変わる → 画面では 問題なかったサーバーがアップデートした日から常に少し遅くなって入力遅延、人が集中するとカクつき・スローモーション
- 症状
- 入力遅延, カクつき, スローモーション
- 要因
- 遅延, ストール, ジッター
- 誰に起きるか
- サーバー全体
- いつ
- 常に, 人が集中したとき
- 担当
- 主担当 インフラチーム・サーバーインフラ
- インフラチームの対応
- アップデートは一部のサーバーに先に適用し、ティック時間・遅延・CPU使用率を以前のバージョンと比べてから範囲を広げる、ゲームのアップデートとは別の日にデプロイ、アップデート前後のカーネル・ドライバー・ファームウェアのバージョンと主要なsysctlの値を記録、問題が出たら以前のカーネルで起動して確認、緩和策を無効にする設定(mitigations=off)はセキュリティリスクを検討して決める。
- 数値の目安
- カーネルのバージョンが変わると、デフォルトの動作も変わります。たとえばLinuxは6.6以降、スケジューラーをCFSからEEVDFへ移行し始め、接続待ちキューの上限(somaxconn)のデフォルト値も5.4で128から4,096に変わりました。CPU脆弱性の緩和策は、カーネルからプログラムに戻るとき(システムコールを終えるたび)や、コンテキストスイッチ・仮想マシンの切り替えのときにCPU内部のバッファを消去するなどの処理を追加するため、パケットごとにシステムコールを呼ぶネットワークサーバーほど影響を受けます。一部の脆弱性は、完全に防ぐにはSMT(1つのコアを2つのスレッドのように使う機能)を無効にする必要があり、SMTを無効にすると処理内容によっては性能が大きく下がります。カーネルパラメータmitigations=offはこれらの緩和策をすべて無効にして性能を取り戻しますが、脆弱性にさらされます。
- グラフでは
- ある時点から階段状に上昇 · サーバーのティック時間、CPU使用率、同じ負荷での遅延
- 確認箇所
- パッケージマネージャーのアップデート履歴と再起動時刻、uname -rで確認したカーネルバージョン、ethtool -iで確認したNICドライバーの情報を、遅延が上がった時刻と突き合わせる。アップデートしたサーバーとしていないサーバーを同じ負荷でmpstat・pidstatを使って比較し、/sys/devices/system/cpu/vulnerabilities/の緩和策の状態も比較
- 該当する場合
- 遅延・CPU使用率が、アップデート後に再起動した時刻から一段上がってそのまま続き、同じ負荷でアップデートしたサーバーだけが高い。以前のカーネル・ドライバーで起動すると元に戻る
- 該当しない場合
- アップデートしたサーバーとしていないサーバーが同じ負荷で同じように遅ければこの原因ではない。同じ日にゲームのアップデートもデプロイし、ユーザーあたりのパケット数・サイズが変わっていれば「アップデートによるトラフィックパターンの変化」
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- もっと詳しく
- 緩和策の状態は/sys/devices/system/cpu/vulnerabilities/以下のファイルで確認します。デフォルト(mitigations=auto)はSMTを有効にしたまま緩和しますが、auto,nosmtにすると脆弱なCPUではSMTを無効にするため、カーネルを更新した後に論理コア数が半分に減ることがあります。ゲームのアップデートと同じ日にOSをアップデートすると原因の切り分けが難しくなるので、別々にデプロイします。
出典
- The kernel’s command-line parameters Linux kernel
mitigations=:offはCPU脆弱性の緩和策をすべて無効にして性能を上げるが脆弱性にさらされる、デフォルトのautoはSMTを有効にしたまま緩和、auto,nosmtは必要ならSMTを無効にする - MDS - Microarchitectural Data Sampling Linux kernel
緩和策は、カーネルからユーザー空間に戻るときと仮想マシンに入るときにCPUのバッファを消去、/sys/devices/system/cpu/vulnerabilities/以下のファイルで脆弱性・緩和策の状態を確認、完全に防ぐにはSMTを無効にする必要があるCPUが多く、SMTを無効にすると処理内容によっては性能への影響が大きい - Spectre Side Channels Linux kernel
緩和のために、コンテキストスイッチ・仮想マシンの切り替え時に分岐予測バッファを消去し、強力な緩和策はすべてのプログラムにオーバーヘッドを加える - EEVDF Scheduler Linux kernel
Linuxは6.6以降、スケジューラーをCFSからEEVDFへ移行し始めた - listen(2) — Linux manual page Linux man-pages
somaxconnのデフォルト値がLinux 5.4で128から4,096に変更 - ethtool(8) — Linux manual page ethtool
ethtool -iでネットワークデバイスのドライバー情報を取得
あわせて読みたい原因
同じ層:L7 サーバーOS(カーネル)
同じ症状(入力遅延)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る