$30 off During Our Annual Pro Sale. View Details »

Firecracker Snapshottingを調べてみた

@ジュジュ
December 20, 2022
450

Firecracker Snapshottingを調べてみた

JAWS-UGコンテナ支部#22 のLTです

@ジュジュ

December 20, 2022
Tweet

Transcript

  1. 2022/12/20 岡野兼也
    Firecracker Snapshottingを調べてみた
    @Juju_62q

    View Slide

  2. ※本発表は一部推測混じりな部分がある他、発表者が読解ミスをしている可能性
    があります。そのことにご留意の上温かく聞いていただければ幸いです。

    View Slide

  3. LambdaのSnapStartがすごい!

    View Slide

  4. ということでLambdaのSnapStartを支えている(であろう)技術を調べてみました

    View Slide

  5. 岡野兼也 / @Juju_62q
    株式会社タイミー
    プロダクト本部
    ワーキングリレーションチーム
    (Stream Aligned Team)
    Backend Engineer

    View Slide

  6. 目次
    ● SnapStartとは
    ● Firecrackerとは
    ● Firecracker Snapshotting
    ● Snapshottingの問題
    ● おわりに

    View Slide

  7. 1 SnapStartとは

    View Slide

  8. Javaで書いたLambdaがめっちゃ早く動く技術

    View Slide

  9. 2 Firecrackerとは

    View Slide

  10. ServerlessのためのMicroVMを素早く動かす軽量VMM

    View Slide

  11. 3 Firecracker
    Snapshotting

    View Slide

  12. Snapshotについておさらい
    ディスクの中身を保存 保存したファイルから VMを復元

    View Slide

  13. Lambdaでは?(従来)
    Lambdaを構成するZipファイル
    (Snapshot)
    Amazon S3 AWS Lambda
    Lambdaの実行環境
    Lambdaの関数や実行環境 新VMを立ち上げる際にLoad ファイルから初期化&関数実行

    View Slide

  14. Lambdaでは?(SnapStart)
    Lambdaを構成するZipファイル
    (Snapshot)
    Amazon S3 AWS Lambda
    Lambdaの実行環境
    Lambdaの関数や実行環境
    +初期化済みメモリ
    新VMを立ち上げる際にLoad ファイルから関数実行

    View Slide

  15. つまりメモリが保存されるようになった

    View Slide

  16. In order to make restoring possible, Firecracker snapshots save the full state of the following resources:
    ● the guest memory,
    ● the emulated HW state (both KVM and Firecracker emulated HW).
    The state of the components listed above is generated independently, which brings flexibility to our snapshotting support. This
    means that taking a snapshot results in multiple files that are composing the full microVM snapshot:
    ● the guest memory file,
    ● the microVM state file,
    ● zero or more disk files (depending on how many the guest had; these are managed by the users).
    Firecracker.「Firecracker
    Snapshotting」.https://github.com/firecracker-microvm/firecracker/blob/main/docs/snapshotting/snapshot-support.m
    d, (2022/12/19)
    Firecracker Snapshottingの対象

    View Slide

  17. Firecracker Snapshottingの対象
    1. ゲストマシンのメモリ
    2. VMのHWの状態
    3. ディスク(MicroVMについている分)

    View Slide

  18. あ〜なんか行けそう

    View Slide

  19. 必要なところ全部コピペってことね
    ※パフォーマンスやファイル等の共有のためCoWを採用していたりめちゃくちゃ工夫がされています

    View Slide

  20. とはいえ問題があるらしい

    View Slide

  21. 4 Snapshottingの問題

    View Slide

  22. アプリケーションでの乱数生成に関して、ユーザランドで動くアプリケーションの実装に
    よっては十分に乱数であることが保証できない場合があるらしい

    View Slide

  23. ちゃんと動くとされている乱数(諸説あり)
    Hardware
    Firecracker
    MicroVM MicroVM
    ユーザー空間 ユーザー空間
    GetRand

    View Slide

  24. 問題がありそうなパターン
    Hardware
    Firecracker
    MicroVM MicroVM
    ユーザー空間 ユーザー空間
    GetRand

    View Slide

  25. 現状の対応
    1. `/var/lib/systemd/random-seed` などある程度問題の有りそうなファイルを
    削除する
    2. それ以外に関しては殆どの場合十分に安全
    a. できるだけ安全性を上げるにはエントロピープールにカーネルから取得した乱数を追加する
    b. これにより、乱数生成を再シードする

    View Slide

  26. 解決策①: MADV_WIPEONSUSPENDの利用
    仮想マシンのSUSPEND時にsnapshotを取ってはいけないメモリをマークする
    結果として問題の対象になりそうなメモリをコピーしない
    これにより、ユーザランドの乱数をカーネルから再生成するようにする

    View Slide

  27. 解決策①: MADV_WIPEONSUSPENDの利用
    仮想マシンのSUSPEND時にsnapshotを取ってはいけないメモリをマークする
    結果として問題の対象になりそうなメモリをコピーしない
    これにより、ユーザランドの乱数をカーネルから再生成するようにする
    Linuxカーネルに追加したとのこと

    View Slide

  28. 解決策②: SysGenIdの利用
    Restoreされたことを検知し、乱数の再生成を可能にする
    (論文から読み取りきれなかったですが、Issueとかを見る感じはおそらく)
    Restore等のたびにincrementされるIDを仮想デバイスとして提供し、
    値の差分からRestoreされたことを検知する。
    Linuxのデバドラとして提供済みとのこと。

    View Slide

  29. Issueの雰囲気的には②が採用されそう?

    View Slide

  30. 5 おわりに

    View Slide

  31. 感想
    プラットフォーマーは悪意のあるコードを前提としないといけないので大変そう
    たまに少し技術について調べてみると面白い
    今度コードも読んでみようかなと思いました

    View Slide

  32. 参考にした資料
    Firecracker.「Firecracker
    Snapshotting」.https://github.com/firecracker-microvm/firecracker/blob/main/docs/snapshotting/snapshot-support.md,
    (2022/12/19)
    Marc Brooker et al., 2021. Restoring Uniqueness in MicroVM Snapshots

    View Slide

  33. ご清聴ありがとうございました

    View Slide