2010/02/10
ディスプレイカードの温度表示
ディスプレイカードの温度上昇が原因と思われる
表示不正が稀に発生するので、
ディスプレイカードの温度を取得して表示してみた。
取得した温度は普段利用しているデスクトップ環境で常時表示している
GKrellM (1)
のセンサー表示部分に多少無理やり表示してしまう事にする。
GKrellM (1) は mbmon (1) をデーモンとして起動しておくと
mbmon (1) から取得した3種類の温度を表示できるので、
mbmon (1) を改造して3番目の温度を
ディスプレイカードの温度に変更してしまうというのが
「多少無理やり」な方法だ。
ディスプレイカードに nVidia の GeForce を使用しているので、
温度は nvidia-settings (1) の
--query オプションを利用すると取得できる。
まずは mbmon (1) のソースを改造し
nvidia-settings (1) を popen (3) で呼び出してみると
確にディスプレイカードの温度は取得できるのだが、
温度取得のたびに nvidia-settings (1) コマンドが起動されるので
システムリソースに負荷がかかり過ぎてしまう。
そこで nvidia-settings (1) のソースに付属している
サンプルプログラムを調べてみると、
割と簡単にディスプレイカードの温度を取得できる事が判ったので
mbmon (1) から直接ディスプレイカードの温度を取得する。
まずは、必要となる NVCtrl.h、NVCtrlLib.h、
libXNVCtrl.a の3ファイルを準備するために、
nvidia-settings をコンパイルする。
ports/x11/nvidia-settings で make (1) を実行すると、
ports/x11/nvidia-settings/work/nvidia-settings-1.0/src/libXNVCtrl
に上記3ファイルが作成される。
次に mbmon (1) を修正してプログラムをインストールする。
ports/sysutils/mbmon ディレクトリで
make configure まで実行した後で以下のパッチを適用し、
上記3ファイルを prts/sysutils/mbmon/work/xmbmon205にコピーして
make (1)すると
ディスプレイカードの温度を取得できる mbmon (1) ができる。
この mbmon (1) をデーモンとして起動すると
GKrellM (1) のセンサー表示部分の
温度表示の 3番目にディスプレイカードの温度が表示できる。
diff -rcN xmbmon205.orig/Makefile xmbmon205/Makefile *** xmbmon205.orig/Makefile 2010-02-10 15:42:38.000000000 +0900 --- xmbmon205/Makefile 2010-02-10 15:45:16.000000000 +0900 *************** *** 25,30 **** --- 25,34 ---- LIBS= -lm LIBSX=$(LIBS) -L/usr/X11R6/lib -lXt -lSM -lICE -lX11 + INCLUDES+= -I. -I/usr/X11R6/include + LIBS+= -L. -lXNVCtrl -L/usr/X11R6/lib -lXext -lX11 + DEFS+= -DNVHACK + #CC=/compat/linux/usr/bin/gcc CC=cc CFLAGS+=$(INCLUDES) $(DEFS) diff -rcN xmbmon205.orig/mbmon.c xmbmon205/mbmon.c *** xmbmon205.orig/mbmon.c 2010-02-10 15:31:52.000000000 +0900 --- xmbmon205/mbmon.c 2010-02-10 15:17:02.000000000 +0900 *************** *** 36,41 **** --- 36,47 ---- # include <sys/sysctl.h> #endif + #ifdef NVHACK + #include <X11/Xlib.h> + #include "NVCtrl.h" + #include "NVCtrlLib.h" + #endif + #include "mbmon.h" static const char *MyName = "mbmon"; *************** *** 510,515 **** --- 516,536 ---- getTemp(&temp1, &temp2, &temp3); + #ifdef NVHACK + { + + Display *dpy; + int temp; + + if((dpy = XOpenDisplay(NULL))){ + if(XNVCTRLQueryAttribute(dpy, 0, 0, NV_CTRL_GPU_CORE_TEMPERATURE, &temp)) + temp3 = temp; + XCloseDisplay(dpy); + } + + } + #endif + /* get fan speeds */ getFanSp(&rot1, &rot2, &rot3);