はじめに

このサイトを運営するために使っている、D510MOというマザーボードを数年ぶりに置き換えました。
移行先のマザーボードは、今更感はありますが、GIGABYTE GA-AM1M-S2HとAMD Athlon 5350です。

AMDのシステムでFreeBSDを動かそうとする度に、過去何度となくトラブルに遭遇してきたので、警戒はしていたのですが、やはりというか早速トラブルが…

システム起動直後にしばらく経つと、ハードウェアリセットがかかるようになりました。
ログにも一切の痕跡を残さずに。

このページでは、この問題に対する対処について説明します。

エラーの原因とその対処

このトラブルですが、powerdを有効にした直後に発生したので、このあたりが原因かと思い、色々調べてみましたが、既にバグとしてレポートされていました。
(こういうことがあるので、FreeBSDでサーバーを構築する場合には、最新ではなく少し古めのシステムを使うとよいと思います。)

【ご参考】Bug 189267 - [cpufreq] AMD Kabini (AM1/FM1Sb) Frequency Switching Causes Crash

powerdが有効になっていて、かつacpi_throttleが有効な状態で、システムが省電力モードのC6ステートに入ると、ハードウェアリセットかかるみたいです。
このバグレポートでは、回避策として以下の3つが挙げられていました。

(1) powerdを無効にする。

「/etc/rc.conf」の設定
powerd_enable="NO"

(2) powerdを有効にするが、acpi_throttleは無効にする。

「/etc/rc.conf」の設定
powerd_enable="YES"

「/boot/loader.conf」の設定
hint.acpi_throttle.0.disabled=1

(3) マザーボードのBIOS/UEFIの設定で、C6ステートを無効にする。

こちらは、マザーボードのBIOS画面から設定を変更します。
(マザーボードごとに設定方法が違います。)

リセットの原因

powerdは、OS側から負荷に応じてCPUのステートを変更することで、CPUの周波数を制御し、省電力化を図っています。
雑に言うと、powerdはCPUの周波数をソフトウェアで制御しています。

一方、acpi_throttleはハードウェア制御で、OSに依存せず、コアの温度などを元に自動的にCPUの周波数や周辺回路のON/OFFを行っています。
後者の実装の例として、IntelのEIST(Enhanced SpeedStep Technology)や、AMDのCool'n'Quietが有名です。

排他ではなく、両方が併用されることにより、システムがより省電力になるため、今回は(3)で対処することにしました。

ご参考までに、acpi_throttleが動作するためには、CPUが特定のステートに遷移している必要があります。
例えば、Intel CPUでEISTによりターボブーストが有効になる(=POステートになる)には、CPUのステートがP1に遷移している必要があります。
このCPUのステート制御をしているのがpowerdですので、powerdが無効になっていると、結果的にacpi_throttleが動作しない、というわけです。

じゃあ、powerdでC6に入らないように制御できれば、この不具合は発生しないのでは、と思ったのですが、実はそうできない理由があるみたいです。

【ご参考】TuningPowerConsumption

AMDプラットフォーム用のシステムでは、OS側には個別のCステートが公開されず、温度や負荷に応じて内部のステートが自動的にC1、C2、C3…C6と変化するようです。
つまりは、powerd側ではC6に遷移することを止められない、ということになります。

IntelとAMDのCPUには、こういう細かい違いがあるのですね。
なかなか難しいです。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。