HVMでspinlockが遅い
結論 : HVMが何か遅いと思ったらSMPを無効にして新規インストールしろ APICも無効にしないとダメっぽい。。
Cygwinがほんとうにあまりにも遅いのでWindowsのカーネルプロファイラ(kernrate)で見てみた。
Time 26975 hits, 25000 events per hit -------- Module Hits msec %Total Events/Sec hal 23447 73500 86 % 7975170 ntkrnlpa 3127 73500 11 % 1063605 intelppm 235 73500 0 % 79931 Ntfs 73 73500 0 % 24829
halが80%を占めている。。内訳は、
----- Zoomed module hal.dll (Bucket size = 16 bytes, Rounding Down) -------- Percentage in the following table is based on the Total Hits for this Zoom Module Time 23447 hits, 25000 events per hit -------- Module Hits msec %Total Events/Sec KeReleaseQueuedSpinLock 8184 73500 28 % 2783673 KeAcquireQueuedSpinLock 5972 73500 20 % 2031292 KeAcquireInStackQueuedSpinLock 3308 73500 11 % 1125170 KeAcquireInStackQueuedSpinLockRaiseToSynch 1724 73500 5 % 586394 ExReleaseFastMutex 1437 73500 4 % 488775
要するにMutexだ。
SMPではなく、シングルプロセサとして運用しているので、"スピンロックで待ってる間に相方のCPUが居なくて完全に無駄になるパターン"では無いはず。
ただ、インストール当初はSMPにしてたので、HALをユニプロセサ版に戻さないといけない。
というわけでHALをユニプロセサ版に戻そうと思ったら単なるACPI HALにしてしまい*1起動せず。
追記 : というわけでHALに合わせてAPICを無効にすることで問題解決。
Module Hits msec %Total Events/Sec ntoskrnl 2912 8922 84 % 6374610 hal 399 8922 11 % 873444 Ntfs 86 8922 2 % 188261 win32k 35 8912 1 % 76703