狠狠撸

狠狠撸Share a Scribd company logo
Docker + Checkpoint/Restore
Yuto Kawamura(kawamuray)
● Yuto Kawamura(kawamuray)
● 東京工科大学修士過程2年でした
● Docker(Container)を用いた効率的なリソーススケジューリングについて研
究していました
● http://cloud.watch.impress.co.jp/docs/case/20150224_689058.html
About me
● 修士でやっていた研究の一部を紹介します.
● 一言で言うと,Checkpoint/Restore(CRIU)を用いてコンテナの起動を高
速化するという話です.
Today’s topic
● Using this tool, you can freeze a running application
(or part of it) and checkpoint it to a hard drive as a
collection of files. You can then use the files to restore
and run the application from the point it was frozen at.
● http://criu.org/
● (ほんとは全然違うけど)VMのスナップショットみたい
な動作イメージ
Checkpoint/Restore
Checkpoint/Restore
fdinfo-2.img
fifo.img
filelocks.img
ifaddr-8.img
inetsk.img
inotify.img
mm-1.img
mountpoints-11.img
netdev-8.img
cgroup.img
Running environment
Checkpoint Image
Proc1
Proc2
Proc3
criu dump
criu restore
● Startup acceleration
● Live migration
○ LXCでは複数の実装例http://www.
slideshare.net/kawamuray/lxc-onganeti
○ 完全なLive migrationではない
■ わずかなダウンタイム
● http://criu.org/Usage_scenarios
Checkpoint/Restoreの使い道
颁搁滨鲍を使う目的
これ
● n台のサーバで構成されるPaaSクラスタのサービスキャパシティを最大化
したい
● キャパシティを増やしたいならサーバ増やせば良いのでは?
○ 金がない
● 稼働率の低いインスタンスはすぐ殺す
● サービスの負荷が上がったときはものすごくオンデマンドにリソースを増
やす
● inetd
リソース効率の最大化
● アプリケーションによっては起動がとても遅い
○ Java(JVM)アプリは顕著(そして多い)
○ アプリケーション(コンテナ)の中身に関わらず(外部から)起動を高速
化したい
(色々ある)問題点(の一つ)
Application startup time problem
Initialization Serving
Initialization Serving
Initialization Serving
Instance1
Instance2
Instance3
Overhead x Number of created instances
e.g, Tomcat8
Real time 3.715386 s
CPU time(according to cgroups) 17.13 ms
Solution
Initialization Serving
Serving
Serving
Instance1
Instance2
Instance3
Checkpoint image
● アプリケーションの起動が完了したタイミングで作成する必要がある
● どうやって判定する?
○ TCPソケットを経由してサービス提供するアプリを想定
○ 指定portにlistenを始めた時点で起動+初期化が終わったということ
にしよう
● 他の方法
○ アプリケーション側から通知してもらうなど
○ 計測対象にしたいくつかのサーブレットアプリ(tomcat)は↑の方法で
十分だった
Create Checkpoint Image
● Checkpoint/Restore機能をDocker daemonに実装した
○ docker checkpoint CONTAINER_ID
○ docker restore CONTAINER_ID CHECKPOINT_ID
● 外部からcriuコマンドを実行するのはだめ?
○ CRIU_REPOS/contrib/docker_cr.sh
■ docker daemonのchild processとしてリストアできない
■ docker daemonが復元したコンテナを認識できない
■ restoreしたcontainerが迷子になります
● Patches are available at https://github.
com/kawamuray/docker/commits/master
Native support of CR on Docker
Docker run process
Docker restore process
Implementation
Docker daemon
Checkpoint Image
Container
type ContainerCheckpoint struct {
ID string
ImageID string
NetworkSettings *NetworkSettings
CreatedAt time.Time
}
Checkpoint Image
/var/lib/docker/containers/{ID}
/checkpoints/{CHECKPOINT_ID}
Image(AUFS layer)
Checkpoint
criu dump
Container
criu restore
Restore
DEMO
● 一つのチェックポイントから複数のコンテナをリストアするた
めに,Checkpoint imageを書き換える
Patched checkpoint image
Patch
eth0 IP address 192.168.123.111
eth0 MAC address 52:54:00:4a:0b:6e
Cgroups hierarchy /system.slice/fuga
eth0 IP address 192.168.123.110
eth0 MAC address 52:54:00:4a:0b:6d
Cgroups hierarchy /system.slice/hoge
ContainerA
Restore
ContainerB
Restore
No conflicts
Startup time benchmark
HDD SSD
Tomcat8
● Patches from Saied Kazemi
○ Googler
○ CRIU contributor
○ https://speakerdeck.com/saied/experimental-docker-checkpoint-and-
restore-with-criu
○ https://github.com/filbranden/docker/pull/1
○ https://github.com/SaiedKazemi/libcontainer-criu/pull/1
Similar works
● Checkpoint/Restoreは,アプリケーションコンテナの起動高速化に使えま
す.
● Checkpoint/Restoreの注目度と可能性は無限大です.
● CoreOS最高!
まとめ

More Related Content

Docker + Checkpoint/Restore