- http://iijlab-seminars.connpass.com/event/29827/
- スライド
- 日時: 2016-04-12 18:00〜19:00
- 場所: IIJ飯田橋 13F
- 話者: 田崎創(Hajime Tazaki)
- 動機
- ネットワークシミュレータの研究をしていて、シミュレーションと実機とで二重にコードを持ちたくなかった。
- Linuxのネットワークコードは618KLoCもある。
- だからといってシミュレーションするときにLinuxをVMで動かすと遅い。
- 新しいソフトを使うときにVMで検証してる?
- マイクロソフトでさえ頻繁に検証するわけではない実態。
- (一般的にいって)性能と利便性のトレードオフがある。
- 問題はindirectで解決できるという名言。
- AnyKernel (NetBSDというOSのrump kernelみたいなもの)
- clock,memory,scheduler,deviceIO(NIC,blockdev)だけがarchitecture dependで
- その上にarch independentな層、さらにその上に(改造なしの)カーネルをもってくる。
- カーネルの上にAPIを被せてアプリケーションはAPI経由でカーネルを利用する。
- やりかた
- Arch independentな層を入れたり
- 抽象的なCPU archを導入したり
- アプローチ
- フルスクラッチ: mirage, includeos, seaster, mtcp
- 性能的に有利
- 移植: OSv, libuinet, sandstorm
- 最新版への追従性に難
- anykernel(移植ではなくそのままもってくる): NetBSD rump, UML, DrawBridge(マイクロソフト製,論文からするとおそらく)
- カーネル資産をつかえる、最新版への追従性も良好
- フルスクラッチ: mirage, includeos, seaster, mtcp
- LKL: Linux Kernel Library
- https://github.com/lkl/linux
- カーネルのライブラリ化
- 2007年にルーマニアでスタート(rumpと同時期)
- IOはいまどきのvertio
- win32,linux,freebsdなどの上で動作
- DCE/LibOS
- 2008年スタート
- LKL vs LibOS
- LKLはpthreadでIRQ,kthread,timerを実装
- LibOSは高位APIをpthreadで実装
- デバイスイタンフェース: TAP, DPDK, VDE
- wrapperの規模は2400LoC、CPU非依存
- ホストOSにはNT,POSIX,MacOS,Linuxがつかえる。
- LKL APIの種類:
- (1) LKL syscall: ふつうのsyscallに相当: lkl_sys_hogehoge()
- (2) Hijack Lib: LD_PRELOADでsocket()をlkl_sys_socket()に曲げたり. linux以外ではsyscall emulatorが必要になる
- (3) extended(alternative)libc: musl(マスル)。 libcを拡張してアプリに機能を提供。
- アプリケーションの例
- ns-3(ネットワークシミュレータ)
- ns-3の中でLKLを読み込んでネットワークスタックを利用する。dlmopen
- 実機とちがってタイミングが毎度同じなので再現率100% (仮想クロック使用時)
- valgrindでデバッグできる。
- 簡易カーネルバイパス
- LD_PRELOAD=hogehoge-tcp.so firefox などとして、ホストカーネルとは異なるネットワークスタックをつかってみたり。
- ext4読み書き
- windows上でext4のディスクにアクセスする。
- unikernel
- 単一アプリにカーネルをリンクする、小さなゲストOS。rumpに似ている。
- たとえばping6コマンドにLinuxを埋め込むなど。
- たとえばarm-qemu上でゲストOSを起動しないでpingを実行するとか。(pingにOSがリンクされている)
- 今日の発表もこれをつかっているらしい。
- ns-3(ネットワークシミュレータ)
- 性能について (UDP 1000B)
- native kernelがRTT/thruputともにベスト
- DPDKはRTTがとんでもなく遅い。thruputも低い。
- netmapとtapはthruputが低い
- Q:コストは?
- A: 初期化はふつうのカーネルよりも速い。デバイスの応答を待つ必要がないのと、不要なデバイス初期化をなくせるのとで。メモリフットプリントはとても大きい。おそらく実装の問題。らくらくGB越え。qemuでメモリサイズをGBにしないと動かない。
- Q: 改造量は?
- A: IRQ,threadなどだけをposixで実装して、他の下廻りはカーネルのコードをそのままつかっている。
- Q: 昔のSunのマシンがやっていたメモリリフレッシュとかはどうなるだろう?
- A: たぶんそのまま動く???
- Q: ns-3での再現性100%はほんとうか?
- A: パケットのキャプチャと再生はできるという意味ではyes。実行時のトレースはとっていないので、スレッドのインターリーブによる部分は再現できないだろう。
- Q: ext4の例はどのレイヤでやっている?
- A: ディスクイメージをLKLが解釈している。VFSはつかっていない(ホストOSのVFSのことか?)。
- Q: LKLのデバッグは?
- A: gdbでカーネルデバッグできる。
- archLinuxベースらしい。