1. 概要
モニタリングから、少々、逸脱しますが。
「FreeBSD」にもともと用意されているデーモンで、「システムの状態をモニタリングし、パワーコントロールオプションをセット」できるそうで。
「CPU の負荷に応じて、CPUのクロックを変更し、電力消費を抑えること」ができるそうなのです。
実は、ここでわたしの本来の目的は、「電力消費を抑える」ことではないのです。
持っているマシンで、スペック的には申し分ないのですが、少し古く、内部にほこりがたまったり、ファンがへたったりしているためか、発熱がものすごく出るマシンがあるのです。
重たい「ports」を「make」していると、熱暴走して止まります。
強制停止になるのは、いいことで、以前、人のものですが、自作のマシンが発熱して、煙が出始めて、あわや火事になるかという経験もありますのでね。
ただそれでは、「ports」の「make」ができません。
「powerd」でなんとかできないものかと思った次第です。
「BIOS」をいじることも必要になりますが、ここでは「BIOS」については、割愛します。
本ページは、下記のサイトを参考にさせていただきました。
「On-line Manual of "powerd"」
「powerd による省電力設定」
「FreeBSD で CPU の発熱や消費電力を抑える」
「powerd」
2. カーネルモジュールのロード
「powerd」を使用するには、「cpufreq」というカーネルモジュールをロードする必要があります。
テンポラリにロードするのであれば。
kldload cpufreq
ここで、「BIOS」が対応できていないと。
kldload: an error occurred while loading module cpufreq. Please check dmesg(8) for more details.
てなことになっちゃいます。
逆に。
kldload: can't load cpufreq: module already loaded or in kernel
と表示されれば、「kernel」に組み込まれているので、以下の処理は不要で、次項へ進めるようです。
「boot」時に組み込むのであれば
/boot/loader.conf
に、下記の1行を組み込んで、起動します。
cpufreq_load="YES"
テンポラリにロードした場合も、「bootloader」へ組み込んだ場合も、うまくロードできているか確認するには。
「root」ユーザ権限で。
kldstat
結果が下記のように、表示されます、
Id Refs Address Size Name
1 38 0xffffffff80200000 1d34598 kernel
2 1 0xffffffff81f35000 7718 cryptodev.ko
3 1 0xffffffff81f3e000 37c540 vmm.ko
4 1 0xffffffff822bb000 5d51c8 zfs.ko
6 1 0xffffffff828a4000 36c8 coretemp.ko
7 1 0xffffffff83220000 2200 acpi_dock.ko
8 1 0xffffffff83223000 3250 ichsmb.ko
9 1 0xffffffff83227000 2178 smbus.ko
10 1 0xffffffff8322a000 21dc nmdm.ko
11 1 0xffffffff8322d000 7798 if_bridge.ko
12 1 0xffffffff83235000 60e0 bridgestp.ko
Id や順番はともかくとして)、上記であれば 「Id 6 coretemp.ko」の行が表示されていれば、うまくロードできています。
3. 起動
うまく、カーネルモジュールをロードできたら、「powerd」を有効化して、起動します。
sysrc powerd_enable=YES
service powerd start
下記で。
service powerd status
powerd is running as pid 1054.
となれば(数値は、プロセスID なのでまちまち)、動いているはずです。
うまく機能すれば、状態に合わせて、温度や周波数が調整されるはずで、前ページのようにモニタリングしてみます。
4. 調整
「powerd」をしばらく使ってみましたが、オプション使わないとダメそうです。
忙しい時に、周波数をあげて、ひまなときに下げるだけ。
結局、思い「ports」を「make」すると、発熱で停止してしまいます。
オプションをいじります。
vi /etc/rc.conf
powerd_enable="YES"
の下に、下記の行をいれます。
powerd_flags="-a min"
これは、「AC」電源接続時に「最も大きな省電力を得るために最低の性能値を選択」しています。
この状態で、2、3日ようすを見ました。
これまでは、重い「ports」を「make」していると、すぐに 100℃ を超えて、110℃ あたりになって、マシンが停止するという状況でしたが。
まず、すぐには温度が上昇せず、70℃ あたりで、ものすごく負荷がかかるときでも、90℃ あたりで止まっています。
「rust」を「make」しても止まりませんでした。
オプション的に、常時、交流電源に接続しているので「-a」なのですが。デフォルトが「-a adaptive」なので、モードの調整はできないようです。
sysctl dev.cpu.0.freq_levels
dev.cpu.0.freq_levels: 2300/45000 2200/42264 2100/40021 2000/37387 1900/35236 1800/33127 1700/30647 1600/28627 1500/26648 1400/24305 1300/22413 1200/20566
「-a adaptive」で、最高周波数を抑えるか、「-a minimum」で最低周波数をあげるか。
常時、周波数をあげおくのもばかな話か。
「-a adaptive ーM 1200」から徐々にあげて、しきい値をさぐることにしますか。
対象のマシンでは、「1900」あたりが限界のようです。
最低ラインからは、だいぶ上なので、よしとします。
2024年6月19日、また、熱でこけたので「1800」へ下げます。
2024年6月21日、「rust」の「portupgrade」で何度やってもこける、とうとう、「1300」まで下げることになってしまいました。
5. 表示の違い
「CPU」やマザーボードにより、周波数や温度の表示がものすごく異なるようです。
東芝「DYNABOOK」「CPU: Intel(R) Core(TM) i7-3610QM CPU @ 2.30GHz (2294.87-MHz K8-class CPU)」の場合。
$ sysctl dev.cpu.0.freq_levels
dev.cpu.0.freq_levels: 2300/45000 2200/42264 2100/40021 2000/37387 1900/35236 1800/33127 1700/30647 1600/28627 1500/26648 1400/24305 1300/22413 1200/20566
$ sysctl dev.cpu | grep freq:
dev.cpu.7.freq: 1200
dev.cpu.6.freq: 1200
dev.cpu.5.freq: 1200
dev.cpu.4.freq: 1200
dev.cpu.3.freq: 1200
dev.cpu.2.freq: 1200
dev.cpu.1.freq: 1200
dev.cpu.0.freq: 1200
$ sysctl dev | grep temperature
dev.cpu.7.temperature: 64.0C
dev.cpu.6.temperature: 63.0C
dev.cpu.5.temperature: 67.0C
dev.cpu.4.temperature: 67.0C
dev.cpu.3.temperature: 63.0C
dev.cpu.2.temperature: 63.0C
dev.cpu.1.temperature: 66.0C
dev.cpu.0.temperature: 66.0C
てな感じ。
「MOUSE」「CPU: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz (2600.00-MHz K8-class CPU)」の場合。
$ sysctl dev.cpu.0.freq_levels
dev.cpu.0.freq_levels: 2600/-1
$ sysctl dev.cpu | grep freq:
dev.cpu.11.freq: 897
dev.cpu.9.freq: 897
dev.cpu.7.freq: 897
dev.cpu.5.freq: 897
dev.cpu.3.freq: 897
dev.cpu.1.freq: 897
dev.cpu.10.freq: 897
dev.cpu.8.freq: 897
dev.cpu.6.freq: 897
dev.cpu.4.freq: 897
dev.cpu.2.freq: 897
dev.cpu.0.freq: 897
$ sysctl dev | grep temp
dev.pchtherm.0.temperature: 63.0C
dev.pchtherm.0.t2temp: 114.0C
dev.pchtherm.0.t1temp: 111.0C
dev.pchtherm.0.t0temp: 108.0C
dev.pchtherm.0.pmtemp: 77.0C
見え方だけでいうと、「DYNABOOK」の方が好きかな、「MOUSE」の方がはるかにスペックのいいマシンなのですが・・・。