<< Hyper-V R2 on FreeBSD8.1 | main | NASその3 >>

2010/09/17 金

Hyper-V R2 on FreeBSD8.1 その2

calcru問題を抑えきれなかったHyper-VでのFreeBSD 8.1だったが
完全に抑えることができた。
忘れないうちにまとめておこうと思う。
まず、前回のエントリーで書いたが、kern.timecounter.hardware=TSCだけをsysctl.confに書いただけの場合はcalcruが発生しない。ただし、時計の精度はめちゃくちゃだ。
machdep.tsc_freq=自分のマシンのTSC実測値 とした場合は時計の精度がきちんとするが、rc経由で起動したプログラムが一斉にcalcruを吐く。ps, w, topなどのコマンドをつかった場合だ。
その後は一切でないのだが、これは気持ちが悪い。
ということで、気が進まなかったが、以下のようにkernelソースをいじった。

/usr/src/sys/i386/i386/tsc.c
tscval[0] = rdtsc();
DELAY(1000000);
tscval[1] = rdtsc();

//tsc_freq = tscval[1] - tscval[0]; <<コメントアウト
tsc_freq = 自分のマシンのTSC実測値; <<これを追加

すなわち、delayをかけてrdtscでtscの差を取得しているわけだが、これが仮想マシンだといい加減な値が返ってくる。
通常、machdep.tsc_freqでこの値を補正できるのだが、この値の補正のタイミングが遅い気がする(rcで起動されたプログラムの後に有効になってる感じ?)
よって、カーネルにTSC値を直指定してしまうこととしたわけだ。

あとは以下のように設定した。
/boot/loader.conf
debug.acpi.disabled="timer" <ACPIタイマを採用させないように。
kern.hz="100"

/etc/sysctl.conf
kern.timecounter.hardware=TSC <指定しなくてOK.でもとりあえず。

acpi timerを無効にすることによって、kernelはTSCを選んでくれるので、sysctl.confでの指定は意味がないが、とりあえず保険。

これでまったくcalcruは出なくなった。めでたし
SMPを有効にしても平気っぽいけど、まじめに調べていない。というかSMPで使うことがないので、あんまりつっこんで追求はしないと思う。

余談だが、バックアップを行うときはシャットダウンしてからエクスポートしている。
Hyper-Vで状態保存して復帰させるとcalcruを誘発すると思われるからだ。

やっと安心して運用できるなぁ。アップグレードの度に、毎回、tsc.cに1行足さねばならんのは面倒だけど、、
ま、いっか。

Trackback URL