こんにちは、びしょ〜じょです。最近GTX 750 Tiを買ったんですが、その金でCPUをもう少しマシにしたほうが良かったと思いました。おわり。

準備

ArchLinuxの話です。まず nvidia-settingsコマンドが使いたいので nvidia-settings をインストールします。 ArchWikiだとnvidia-utils パッケージに入ってるような話しぶりですが実はそうではない(2016/05/09現在)。

GPUファンを触りたいのでxorg.conf(.d)をいじる。Device SectionでターゲットのGPUに言及しているところで Option "Coolbits" "4" を追加する。

20-nvidia.conf
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 750 Ti"
    Option         "Coolbits" "4"
    # ...
EndSection

ひとまず再起動してください。

nvidia-settings

nvidia-settings コマンドでGUIが表示され、 GPU 0 - Thermal Settings などを見てみると Enable GPU Fan Settings と下にバーがあると思います。 これでファンの速度を調節できるわけですな。

cli

さて自動化ということで、GUIを触っていくのは得策ではありません。 nvidia-settingsはコマンドラインにいろいろ渡すとGUIを触らなくてもよくなる。

nvidia-settings -e list とすると、CLIから触れるパラメータが出ます。ボクもよくわからないので詳細ははぶきます。"fan"などでgrepしてみると、いろいろ出てくる。察していくと GPUFanControlStateGPUTargetFanSpeedが必要なことが分かった。まず前者でファン速度を変更できるようになり(0がdisabled、1がenabled)、後者がファン速度(単位は%、0〜100の整数)

なるほど。

GPUの温度からファンの速度を変更したくなってくる。それはnvidia-settings -q '[gpu:0]/GPUCoreTemp'で取れる。OK。 あとはスクリプトを書いてみる。

fnctrl.sh
#!/bin/zsh

temp=$(nvidia-settings -q '[gpu:0]/GPUCoreTemp' | grep Attribute | awk '{print $4}')

nvidia-settings -a GPUFanControlState=1

if [[ "${temp}" -gt 40 ]]; then # 41度以上でファン速度が爆速
    nvidia-settings -a GPUTargetFanSpeed=100
elif [[ "${temp}" -gt 38 ]]; then # 39度から70%
    nvidia-settings -a GPUTargetFanSpeed=70
else # デフォルト
    nvidia-settings -a GPUTargetFanSpeed=33
fi

雑ですが、まぁよしとします。

systemd.timerで温度を監視

systemdはなんでもできるし、cronも吸収した。 5秒ごとに上のスクリプトを回したい。 はいご覧の通り

[Unit]
Description=gpu fan control

[Service]
Type=simple
ExecStart=/usr/bin/zsh /home/nymphium/.config/systemd/script/gpufanctrl.sh

[Install]
WantedBy=default.target
[Unit]
Description=watch GPU temperature every 5 sec

[Timer]
OnBootSec=1min ; 起動してから1分後に開始
OnUnitActiveSec=5sec ;以後5秒毎
AccuracySec=5sec ; ブレ(?)を修正
Persistent=true ; これが動かすserviceがFAILUREしても続ける

[Install]
WantedBy=timers.target

serviceファイルと同じ名前(同じ名前ではない)のtimerファイルを作成することで、指定した時間にserviceが実行される。 timerファイルの[Timer]の項にUnit=hoge.serviceなどとすると別のserviceファイルのコントロールができる。

最初/etc/systemd/system/に置いたところ、timerは動くがserviceがFAILUREしまくるというよくわからない事態に陥ったため、~/.config/systemd/user/に配置したら無事動いた。

その他

参考

systemd/Timers ArchWiki systemdでの定期実行(timerユニット) Qiita