NixOSのC-stateバグ対応
2026/07/14_NixOSのC-stateバグ対応
現象
ログには何も残っていない
止まるまでの期間も、2週間〜4日でバラバラ
原因と思われる箇所
マイクロコード更新でも防ぎきれない
CPU確認コマンド
code:sh
% grep "model name" /proc/cpuinfo | head -1
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
nixos ~
%
対策
intel_idle.max_cstate=1 をカーネルパラメータに追加。max_cstateパラメータはstateインデックスでありC-state番号ではない(カーネル公式ドキュメント確認済み)。C1までに制限しC6を含む全パッケージC-stateを無効化
マイクロコード更新も適用
code: /etc/nixos/configuration.nix
# Skylake CPUのC6でハードハングするのを防止。max_cstate=1でC1(コアレベルのみ、パッケージC-state非関与)に制限
# Intel CPUマイクロコード更新。Skylake用は 0xf0(rev 240)が最終(2026/07時点)
hardware.cpu.intel.updateMicrocode = true;
→rebuild & 再起動
🔍 7/14の対策(max_cstate=4)の誤りと再調査(2026/07/17)
7/14に max_cstate=4 を設定したが、7/15 19:26 に再びフリーズ(稼働25時間で停止)
原因: max_cstateパラメータは「C-state番号」ではなく「stateインデックス」
Skylake i7-6700 のC-state一覧:
state0 = POLL
state1 = C1(コアレベルのみ、パッケージC-state非関与)
state2 = C1E
state3 = C3
state4 = C6
max_cstate=4 では state4(C6) まで許可されるため、C6が無効化されていなかった
実際に起動5分でC6が178,291回使用されていた(/sys/devices/system/cpu/cpu0/cpuidle/state4/usage 確認)
正しい設定: intel_idle.max_cstate=1 でC1(コアレベルのみ)までに制限
C1はコア単位のアイドルでパッケージC-stateを伴わず、Skylake C6エラッタの影響を受けない
フリーズ頻度の推移(加速していた):
6/14→6/28: 14日(kernel 6.18.33)
6/28→7/4 : 6日
7/5→7/7 : 2日(kernel 6.18.37 にアップグレード)
7/7→7/11 : 4日
7/11→7/14: 3日
7/14→7/15: 1日(最短、max_cstate=4適用後も改善せず)
📖 参考リンク