kvm-clock に時間を尋ねるのは間違っているだろうか

43
kvm-clock に時間を尋ねるのは 間違っているだろうか @deep_tkkn 2015/06/06 Kernel/VM 探検隊 #11

Transcript of kvm-clock に時間を尋ねるのは間違っているだろうか

Page 1: kvm-clock に時間を尋ねるのは間違っているだろうか

kvm-clock に時間を尋ねるのは間違っているだろうか

@deep_tkkn

2015/06/06

Kernel/VM 探検隊 #11

Page 2: kvm-clock に時間を尋ねるのは間違っているだろうか

自己紹介

• Twitter: @deep_tkkn

•本名: 深井貴明

• BitVisor でライブマイグレーションするおじさん

Page 3: kvm-clock に時間を尋ねるのは間違っているだろうか

これからお話するのは

Page 4: kvm-clock に時間を尋ねるのは間違っているだろうか

kvm-clockに翻弄された

Page 5: kvm-clock に時間を尋ねるのは間違っているだろうか

一人の男の愚痴お話…(まぁ僕のことなんですが)

Page 6: kvm-clock に時間を尋ねるのは間違っているだろうか

ある日のこと…

•男は論文執筆のためにSysbenchを走らせていた

•評価対象は物理マシン、BitVisor、KVM

• KVM よりもBitVisor が速い、という結果を期待して

Page 7: kvm-clock に時間を尋ねるのは間違っているだろうか
Page 8: kvm-clock に時間を尋ねるのは間違っているだろうか

小さいブロックサイズではKVMが遅くなる

Page 9: kvm-clock に時間を尋ねるのは間違っているだろうか

,.へ___ ム i「 ヒ_i〉 ゝ 〈ト ノ iニ(()i { ____ | ヽi i /__, , ‐-\ i }| i /(●) ( ● )\ {、 λト-┤. / (__人__) \ ,ノ  ̄ ,!i ゝ、_ | ´ ̄` | ,. '´ハ ,!

. ヽ、 `` 、,__\ /" \ ヽ/\ノ ノ ハ ̄r/:::r―--―/::7 ノ /ヽ. ヽ::〈; . '::. :' |::/ / ,. "

`ー 、 \ヽ::. ;:::|/ r'"

Page 10: kvm-clock に時間を尋ねるのは間違っているだろうか

,.へ___ ム i「 ヒ_i〉 ゝ 〈ト ノ iニ(()i { ____ | ヽi i /__, , ‐-\ i }| i /(●) ( ● )\ {、 λト-┤. / (__人__) \ ,ノ  ̄ ,!i ゝ、_ | ´ ̄` | ,. '´ハ ,!

. ヽ、 `` 、,__\ /" \ ヽ/\ノ ノ ハ ̄r/:::r―--―/::7 ノ /ヽ. ヽ::〈; . '::. :' |::/ / ,. "

`ー 、 \ヽ::. ;:::|/ r'"

男役: やる夫

Page 11: kvm-clock に時間を尋ねるのは間違っているだろうか

数日後…____

/ \/ ─ ─\

/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

KVMが遅くなる理由を考察せねばならん

Page 12: kvm-clock に時間を尋ねるのは間違っているだろうか

考える男____

/ \/ ─ ─\

/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

EPT?BitVisorでも使ってるお

Page 13: kvm-clock に時間を尋ねるのは間違っているだろうか

考える男____

/ \/ ─ ─\

/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

キャッシュミス?なんか違う気がするお

Page 14: kvm-clock に時間を尋ねるのは間違っているだろうか

考える男____

/ \/ ─ ─\

/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

わからんからperfやstrace使うお

Page 15: kvm-clock に時間を尋ねるのは間違っているだろうか

考える男____

/ \/ ─ ─\

/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

きっとブロックサイズに依存するイベントが

あるお

Page 16: kvm-clock に時間を尋ねるのは間違っているだろうか

perfやstraceで調べた結果

• VMExit回数… ブロックサイズによらずほぼ同じ

Page 17: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

?????

Page 18: kvm-clock に時間を尋ねるのは間違っているだろうか

perfやstraceで調べた結果

• VMExit回数… ブロックサイズによらずほぼ同じ

• ブロックサイズを小さくするとclock_gettime()システムコールの呼び出し回数が増える

Page 19: kvm-clock に時間を尋ねるのは間違っているだろうか

なぜclock_gettime()が多くなる?

• Sysbenchは1イベント毎の時間を測定している

• メモリテストの1イベント== 1block のread or write

• —memory-block-size を小さくするイベントの数が増える時間を測定する回数が増えるclock_gettime()を呼ぶ回数が増える

Page 20: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

時間取得の処理が遅いわけないお

Page 21: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

システムコールが遅いんじゃなイカ?

Page 22: kvm-clock に時間を尋ねるのは間違っているだろうか

Syscallの実行時間を調べたら…

getpid()

物理マシン、KVMの間に大きな差なし

clock_gettime()

KVM だけ遅い

Page 23: kvm-clock に時間を尋ねるのは間違っているだろうか

#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;

}

Page 24: kvm-clock に時間を尋ねるのは間違っているだろうか

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:~#

Page 25: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

…..

Page 26: kvm-clock に時間を尋ねるのは間違っているだろうか

KVMだけ時間取得の処理が遅いおwww

____ /_ノ ヽ、_\

ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /

| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))

Page 27: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

なんでKVMだけclock_gettime()が遅いんだお?

Page 28: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

ググってみるお

Page 29: kvm-clock に時間を尋ねるのは間違っているだろうか

http://blog.siphos.be/2013/04/comparing-performance-with-sysbench-part-3/

Page 30: kvm-clock に時間を尋ねるのは間違っているだろうか

____ /_ノ ヽ、_\

ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /

| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))

今までおれが調べたこと全部書いてあるお

Page 31: kvm-clock に時間を尋ねるのは間違っているだろうか

____/ \

/ ─ ─\/ (●) (●)\| (__人__) |/ ∩ノ⊃ /( \ /_ノ | | .\ “ /__| | \/___/

ふむ、current_clockをtscに変えるとまともな結果がでるらしいぞ

Page 32: kvm-clock に時間を尋ねるのは間違っているだろうか
Page 33: kvm-clock に時間を尋ねるのは間違っているだろうか

ぺったんこ…

Page 34: kvm-clock に時間を尋ねるのは間違っているだろうか

____ /_ノ ヽ、_\

ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /

| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))

メモリ処理なんか全然関係なかったおwww

Page 35: kvm-clock に時間を尋ねるのは間違っているだろうか

____ /_ノ ヽ、_\

ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /

| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))

別にBitVisor がとりわけ速いわけでもなかったおww

Page 36: kvm-clock に時間を尋ねるのは間違っているだろうか

____ /_ノ ヽ、_\

ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)| / / / |r┬-| | (⌒)/ / / //| :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) /ヽ / `ー'´ ヽ / /

| | l||l 从人 l||l l||l 从人 l||lヽ -一''''''"~~``'ー--、 -一'''''''ー-、ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))

じゃあこの結果を論文に載せても意味ないお

Page 37: kvm-clock に時間を尋ねるのは間違っているだろうか

____ /:::::::::: u\

/:::::::::⌒三. ⌒\/:::::::::: (○)三(○)\|::::::::::::::::⌒(__人__)⌒ | ________ \:::::::::: `⌒´ ,/ .| | ...| ノ::::::::::u \ | | .|

/::::::::::::::::: u | | | |::::::::::::: l u | | | ヽ:::::::::::: -一ー_~、⌒)^),-、 | |_________.| ヽ::::::::___,ノγ⌒ヽ)ニニ- ̄ | | |

…1節まるまる消えるお…

Page 38: kvm-clock に時間を尋ねるのは間違っているだろうか

なぜkvm-clockは遅いのか?

Page 39: kvm-clock に時間を尋ねるのは間違っているだろうか

そもそもkvm-clockの仕組みは?

Current Time共有メモリ

Host OS

Guest OS

Write

Read

共有メモリでやりとりVMExitとかしない

Page 40: kvm-clock に時間を尋ねるのは間違っているだろうか

ではなぜ遅いのか?

Current Time共有メモリ

Host OS

Guest OS

Write

Host がWrite 時にメモリをロックする

Page 41: kvm-clock に時間を尋ねるのは間違っているだろうか

Read

ではなぜ遅いのか?

Current Time共有メモリ

Host OS

Guest OS

Write

Host がWrite 時にメモリをロックする

GeustからのRead がブロックされる

http://lxr.free-electrons.com/source/arch/x86/kvm/x86.c#L1558

Page 42: kvm-clock に時間を尋ねるのは間違っているだろうか

と思ったんですが…

•全力でclock_gettime()を回してそれぞれにかかった時間のばらつきを見てみる

• kvm-clock とtscのばらつき方が似ている• ロックが原因ならkvm-clock のほうだけ極端に遅い読み出しがあるはず

• うーん…

Page 43: kvm-clock に時間を尋ねるのは間違っているだろうか

まとめ

• Kvm-clock に時間を尋ねるのは間違っているだろうか?頻繁に尋ねるのは間違っている

•頻繁にclocksourceを読むときはtscに変えよう

•遅い原因は共有メモリのロック…だけじゃない?