image

  • 動機
    • ネットワークシミュレータの研究をしていて、シミュレーションと実機とで二重にコードを持ちたくなかった。
    • 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(マイクロソフト製,論文からするとおそらく)
      • カーネル資産をつかえる、最新版への追従性も良好
  • 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がリンクされている)
      • 今日の発表もこれをつかっているらしい。
  • 性能について (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ベースらしい。

image