先日、Dockerの検証機材としてHP Moonshot 1500とProLiant m300 Server Cartridge、ProLiant m710 Server Cartridgeをお借りしてDockerとKVMの性能比較などいろいろ行いました。
お借りする期間を延長していただけたので、もう少し触ってみることにしました。
DockerコンテナーをHPサーバーで利用しているユーザーの多くは、一台のサーバーあたりおおよそ1000のコンテナーを動かすのが一般的なんだそうです。そこで実際ProLiant m300 Server Cartridge(以降m300)でDockerを動かし、どれくらいまでコンテナーを動かせるかを検証してみました。ちなみにDockerホストのOSはメインの検証で使ったRed Hat Enterprise Linux Server release 7.0 (Maipo)と、最近バージョンが更新されたDocker 1.6の組み合わせで行っています。
調査中、1023個まではコンテナーが作れるのにもかかわらず、1024個目を作ろうとするとエラーになるのが気になっていました。性能の限界かと思ったのですが、CPUもメモリーもストレージも上限に当たっている様子はありません。調べたところ、次のような情報を見つけました。
重要な部分を引用します。
a single Linux bridge can only handle 1024 ports. This limits the scalability of docker as it won’t be possible to create more than 1024 containers
なるほど。
そこで、Dockerのネットワークについて、公式のマニュアルを調べて、ネットワークモードの動作の違いについて調査してみました。
# brctl show bridge name bridge id STP enabled interfaces docker0 8000.56847afe9799 no (コンテナーが1個もない状態) # docker run -d --name=test1 --net=host -it registry.access.redhat.com/rhel7.0:latest /bin/bash 7889a809926128f48d4c0cae6914e... (--net=hostモードでコンテナを起動) # brctl show bridge name bridge id STP enabled interfaces docker0 8000.56847afe9799 no (--net=hostではブリッジインターフェイスは増えない) # docker run -d --name=test2 --net=bridge -it registry.access.redhat.com/rhel7.0:latest /bin/bash 95f8740099736c2002f41c174140841e... (--net=bridgeモードでコンテナを起動) # brctl show bridge name bridge id STP enabled interfaces docker0 8000.56847afe9799 no veth976a950 (--net=bridgeではブリッジインターフェイスは増加)
このことから、--net=hostモードであればコンテナ1024個の制限を越えられるのではと思いました。結果、コマンドを実行し、--net=hostモードで1024コンテナーを起動することができました。
では次に2000個動かしてみます。一般的に利用される倍の数です。m300はAtom CPU機なのにもかかわらず、もちろんサクッと2000コンテナも動きました。さすがですね。
ちなみにDockerコンテナーは次のようなシェルスクリプトでちびちびと作りました。
#!/bin/bash for i in {1..100} do docker run -d --net=host -it myrhel7:latest /bin/bash && \ echo $i done echo ":) Finished" docker ps -aq|wc -l echo "個作成完了"
docker psコマンドはコンテナー一覧を表示するためのコマンドです。aオプションで起動中のコンテナを表示、qオプションでコンテナーIDのみ出力し、その結果をwcコマンドでカウントしています。
次の図は2000コンテナー作ったあとのストレージの使用状況とシステム負荷を確認したスクリーンショットです。コンテナーを増やすたびにdfコマンドの結果を確認していきました。コンテナ数に比例してUsedが増えていきましたが、2000コンテナー動かしてもDockerホストを含めて4GBしか使われていないので、まだまだ詰め込むことができそうです。
ロードアベレージについてはコンテナーの作成中は多少負荷が上がりますが、コンテナーが起動後は1以下まで落ちました。コンテナーあたりの負荷をよく計算した上で環境を構築すれば、Dockerは充分実用的であると言えそうです。
このことから、1024個以上コンテナを動かしたいときは
- デフォルトの--net=bridgeモードは不向き
- --net=bridgeモードを使いたいときはOVSを使うと良い
- ポートかぶりに気をつける必要があるが--net=hostモードなら動く
ということがわかりました。
Red Hat Enterprise Linux 7とHP ProLiant m300 Server CartridgeならDocker環境も快適に動作します。皆さんも是非、Docker構築にチャレンジしてみてください。