●Hyper-V R2 on FreeBSD8.1 その2
まず、前回のエントリーで書いたが、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行足さねばならんのは面倒だけど、、
ま、いっか。
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行足さねばならんのは面倒だけど、、
ま、いっか。