kvm-clock に時間を尋ねるのは間違っているだろうか
-
Upload
deeptokikane -
Category
Technology
-
view
317 -
download
5
Transcript of kvm-clock に時間を尋ねるのは間違っているだろうか
kvm-clock に時間を尋ねるのは間違っているだろうか
@deep_tkkn
2015/06/06
Kernel/VM 探検隊 #11
自己紹介
• Twitter: @deep_tkkn
•本名: 深井貴明
• BitVisor でライブマイグレーションするおじさん
これからお話するのは
kvm-clockに翻弄された
一人の男の愚痴お話…(まぁ僕のことなんですが)
ある日のこと…
•男は論文執筆のためにSysbenchを走らせていた
•評価対象は物理マシン、BitVisor、KVM
• KVM よりもBitVisor が速い、という結果を期待して
小さいブロックサイズではKVMが遅くなる
,.へ___ ム i「 ヒ_i〉 ゝ 〈ト ノ iニ(()i { ____ | ヽi i /__, , ‐-\ i }| i /(●) ( ● )\ {、 λト-┤. / (__人__) \ ,ノ  ̄ ,!i ゝ、_ | ´ ̄` | ,. '´ハ ,!
. ヽ、 `` 、,__\ /" \ ヽ/\ノ ノ ハ ̄r/:::r―--―/::7 ノ /ヽ. ヽ::〈; . '::. :' |::/ / ,. "
`ー 、 \ヽ::. ;:::|/ r'"
,.へ___ ム i「 ヒ_i〉 ゝ 〈ト ノ iニ(()i { ____ | ヽi i /__, , ‐-\ i }| i /(●) ( ● )\ {、 λト-┤. / (__人__) \ ,ノ  ̄ ,!i ゝ、_ | ´ ̄` | ,. '´ハ ,!
. ヽ、 `` 、,__\ /" \ ヽ/\ノ ノ ハ ̄r/:::r―--―/::7 ノ /ヽ. ヽ::〈; . '::. :' |::/ / ,. "
`ー 、 \ヽ::. ;:::|/ r'"
男役: やる夫
数日後…____
/ \/ ─ ─\
/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
KVMが遅くなる理由を考察せねばならん
考える男____
/ \/ ─ ─\
/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
EPT?BitVisorでも使ってるお
考える男____
/ \/ ─ ─\
/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
キャッシュミス?なんか違う気がするお
考える男____
/ \/ ─ ─\
/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
わからんからperfやstrace使うお
考える男____
/ \/ ─ ─\
/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
きっとブロックサイズに依存するイベントが
あるお
perfやstraceで調べた結果
• VMExit回数… ブロックサイズによらずほぼ同じ
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
?????
perfやstraceで調べた結果
• VMExit回数… ブロックサイズによらずほぼ同じ
• ブロックサイズを小さくするとclock_gettime()システムコールの呼び出し回数が増える
なぜclock_gettime()が多くなる?
• Sysbenchは1イベント毎の時間を測定している
• メモリテストの1イベント== 1block のread or write
• —memory-block-size を小さくするイベントの数が増える時間を測定する回数が増えるclock_gettime()を呼ぶ回数が増える
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
時間取得の処理が遅いわけないお
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
システムコールが遅いんじゃなイカ?
Syscallの実行時間を調べたら…
getpid()
物理マシン、KVMの間に大きな差なし
clock_gettime()
KVM だけ遅い
#include <unistd.h>#include <time.h>#include <stdio.h>#define NUM 400000000
int main(){int i;struct timespec dummy;for ( i = 0; i < NUM; i++){
clock_gettime(CLOCK_MONOTONIC, &dummy);}return 0;
}
root@mgrt-trgt:~# time ./a.out
real 0m31.867suser 0m6.384ssys 0m25.482sroot@mgrt-trgt:~# echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource[ 1570.562530] Switching to clocksource tscroot@mgrt-trgt:~# time ./a.out
real 0m5.852suser 0m5.848ssys 0m0.000sroot@mgrt-trgt:~#
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
…..
KVMだけ時間取得の処理が遅いおwww
____ /_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
なんでKVMだけclock_gettime()が遅いんだお?
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
ググってみるお
http://blog.siphos.be/2013/04/comparing-performance-with-sysbench-part-3/
____ /_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
今までおれが調べたこと全部書いてあるお
____/ \
/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/
ふむ、current_clockをtscに変えるとまともな結果がでるらしいぞ
ぺったんこ…
____ /_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
メモリ処理なんか全然関係なかったおwww
____ /_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
別にBitVisor がとりわけ速いわけでもなかったおww
____ /_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
じゃあこの結果を論文に載せても意味ないお
____ /:::::::::: u\
/:::::::::⌒三. ⌒\/:::::::::: (○)三(○)\|::::::::::::::::⌒(__人__)⌒ | ________ \:::::::::: `⌒´ ,/ .| | ...| ノ::::::::::u \ | | .|
/::::::::::::::::: u | | | |::::::::::::: l u | | | ヽ:::::::::::: -一ー_~、⌒)^),-、 | |_________.| ヽ::::::::___,ノγ⌒ヽ)ニニ- ̄ | | |
…1節まるまる消えるお…
なぜkvm-clockは遅いのか?
そもそもkvm-clockの仕組みは?
Current Time共有メモリ
Host OS
Guest OS
Write
Read
共有メモリでやりとりVMExitとかしない
ではなぜ遅いのか?
Current Time共有メモリ
Host OS
Guest OS
Write
Host がWrite 時にメモリをロックする
Read
ではなぜ遅いのか?
Current Time共有メモリ
Host OS
Guest OS
Write
Host がWrite 時にメモリをロックする
GeustからのRead がブロックされる
http://lxr.free-electrons.com/source/arch/x86/kvm/x86.c#L1558
と思ったんですが…
•全力でclock_gettime()を回してそれぞれにかかった時間のばらつきを見てみる
• kvm-clock とtscのばらつき方が似ている• ロックが原因ならkvm-clock のほうだけ極端に遅い読み出しがあるはず
• うーん…
まとめ
• Kvm-clock に時間を尋ねるのは間違っているだろうか?頻繁に尋ねるのは間違っている
•頻繁にclocksourceを読むときはtscに変えよう
•遅い原因は共有メモリのロック…だけじゃない?