Skip to main content

山椒の実

Slacker: Fast Distribution with Lazy Docker Containers (Tyler Harterほか)

世間でAlphaGoが凄いことになってるエポックメーキングな日にこれ書くのもアレだけど。

USENIX FAST16の論文のメモ。Tintriとdockerが組み合わさったら何が起きる?

ストレージのせいでコンテナのデプロイが遅いという問題を解決した。具体的にはTintri用のdockerのストレージドライバを作った。コンテナのデプロイを測定するhellobenchってのを開発したらしい。これはgithubに落ちているので、誰でも使える。そこにいる貴方にもだ。

dockerやGoogle Borgといったコンテナ技術は起動が速いという特長があるはずだが、やはりイメージのやりとりというのはそれなりにコストがかかる。起動するときにpullしてくるわけだけど、このコピーが重いのに起動中はデータのごく一部しか使っていない。データの内容としてはdedupがよく効くデータセットだったりする。そのへんはちゃんと分析してあるという印象。

SlackerはTintriの機能を前提に作った、Dockerのストレージドライバで、lazy pullが特長。cache sharingのためにカーネルにも手を入れている…ここはちょっと引くね。もともとDockerのイメージというのは差分管理で軽くされてる。そのDockerのコンテナ起動をより良くするためにここまでやる?

でも効果は大きく、push/pullともに劇的な向上を見せている。multimakeていうgccのバージョンいっぱいのやつを使ったりしていろいろ測定していた。この向上はなかなかのものだ。

dockerのイメージ管理とストレージドライバのインタフェースの説明はイメージがつかみやすいと思う。ただここにどうやってTintri使って高速化を差し込むのか…ここは悩ましいところだったろう。

hellobenchについて。イメージのツリー構造の図も割と面白い。work load analysisではおなじみのblktraceを使ってアクセスパターンを分析。あとは有名なイメージのdocker hubのpull数データをグラフにしたり。何か圧倒的な人気の差が垣間見える…nginxとapacheではやはりnginxのほうが人気があるんだなぁ。CentOS使ってる奴は世の中に存在しないんだな、など。ここでイメージの圧縮率やdedup率も調査している。結論としてはDockerイメージはdedupが割と効く。世代管理してるのにdedupも効くんだ、というのはちょっと意外な感じもする。

肝心のSlackerは、図を見るとregistryとworkerで同じnfsサーバをマウントしてsnapshotとか使って共有してた…まぁTintriだから…普通のやり方じゃないだろうとは思ってたけど。

Tintriは、rest apiでsnapshotやcloneできるようで、そのAPIを使う。イメージはファイルそのままではなくブロックレイヤで持っていて、loopback deviceのところの更新部分のビットマップの拡張を入れているみたい。このへんをカーネルで書いたんだろうな…。これならdm-thinでいいんじゃないかという気もするが、dm-thinよりもうまいことやったんだろう。

性能比較の対象はaufsで、これがかなり劇的なもの。当然、良くなったのはpushとpullのところ。run部分はもともと軽いから。実際にDocker使ってると、aufsはdm-thinよりだいぶ軽くて素直なのが良いんだけど、パーミッションが変になったりするトラブルもあって、ブロックでaufsより高速なら、もはやaufsを使う理由はないだろう。

これが用途としては狭いのか広いのか。イメージのデプロイのとこですよね。まあローカルregistryにpushして、pullして起動…その一連の流れがこんだけ高速化されますよという話なんだけど、実際そこで困ってる人というのがかなり限定的なんじゃないかと思ってしまう。仕事でdocker使ってた頃、1GBくらいのイメージを作ってはデプロイしていたけど、目的のノードがあらかじめ決まってれば、転送自体はチェイン転送を使って1台にデプロイするのと同じ実時間で処理できていた。

つまり、管理者がイメージを転送するときは別に困らないんだ。裏側から管理できるからさ。

この技術を本当に便利に使えるのは、管理者ではなくてユーザがpushしてpull+runを頻繁にやるような環境だろう。Herokuとかdeisやflynnみたいな…PaaSのところか。ユーザがgit pushしたらビルド+pushが勝手に走り、インスタンスを起動するとpull+runが走る。裏側では多数のノードがいて、勝手に割り振られた先でコンテナが走るという感じの領域。

そう考えると割と自分の現在の領域に近い話ではあった。凄い便利なんじゃん。