ept と tlb でしくじった話
TRANSCRIPT
EPT と TLB でしくじった話@deep_tkkn
2016.10.08 Kernel/VM 探検隊
自己紹介
•氏名: 深井貴明
•所属: TKB大学
• Twitter: @deep_tkkn
• BitVisor であれこれしてる人
2
今日のお話
• EPT と TLB 周りでハマって時間溶けて悲しかったお話
•新規性はないと思う• 理屈としては教科書にも載ってそう
• 同じような経験したことある人いると思う
• しかし,実際起きるとどれくらい悲しいか伝えたい
3
EPT, TLB, マルチコア,ウッ頭が
事の始まり
• BitVisor でライブマイグレーションを実装
• シングルコアでは動いたマルチコア対応
4
ライブマイグレーション!
移動元の物理マシン 移動先の物理マシン
マイグレーションってどうやるの?
VMを構成するハードウェアの状態をすべて転送
• CPU
• メモリ
• デバイス
5
マイグレーションってどうやるの?
VMを構成するハードウェアの状態をすべて転送
• CPU
• メモリ
• デバイス
メモリ転送には時間がかかる
“ライブ” にするには,OSのバックグラウンドでメモリ転送
6
バックグラウンドでメモリ転送
7
Src RAM Dst RAM転送
OS がメモリ更新
Dirty page を再送
Dirty page を再送
OS がメモリ更新
・・・
Dirty pages をどうやって追うか
• VT-xのメモリ管理機能 (EPT) の機能の一部を使う• EPT: ゲスト物理アドレスマシン物理アドレスへ変換するページング機構
• 挙動は普通のページングとほぼ同じ
• EPT エントリ (EPTE) にも Dirty bit がある• 該当ページが更新されると立つビット
8
9
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3C:System Programming Guide, Part 3 Order Number: 326019-048US
何も考えずに実装してみた
• メモリ転送は1コアでやる (並列にやるとロックがうざい)
• Dirty bit の操作も 1 コアでやる• Dirty page 送りきったら,すべてのコアの EPTE を走査
• Dirty bit が立ってるページを記録
10
何が起きたか
11
20% の確率でエラー && エラーログが毎回違う
2~3カ月くらい
TLB と EPT の落とし穴
• TLB(Table Lookaside Buffer): アドレス変換のキャッシュ• 毎回ページテーブルを引くと遅いから
• EPT による変換も TLB に載る
• Dirty Bit の情報も TLBに載る• たぶん EPTE がキャッシュに載るイメージ
• TLB はHW がコア間でコヒーレンシー取られない• CPU のデータキャッシュとは違う
12
何が起きていたのか?
• あるコアでほかのコアの EPT エントリを読む
• Dirty bit を読む
•一部の情報はTLBに載ってて古い• 該当ページを書き換えたのに dirty bit が立ってないように見える
• Dirty ページを見逃す
• 一部のページだけ古い状態でマイグレーション
13
修正版の実装
• EPTE 読む前に全コアで TLB shootdownする
• ちゃんと動く
• コードとしては数行の変更
• これに2,3カ月取られたと思うと…
14
大事なこと
•負けないこと投げ出さないこと逃げ出さないこと
• メモリ周りの挙動が怪しければ TLB も疑おう
• 思い当たれば気付けるし直せる
• 知らない & 周りに知ってる人がいないと祈るしかない
• 知る者と知らざる者の差
15
まとめ
• EPTE は TLB に載る
• TLB はハードウェアがコヒーレンシ―取らない
• データキャッシュみたいな感覚だと痛い目を見る
• TLB 絡みのバグはつらい
• メモリが微妙に壊れる
• メモリ周りの挙動が怪しいときは TLB を疑う
16