仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

HP Moonshot 1500でDockerコンテナーをたくさん動かしてみた

先日、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コンテナも動きました。さすがですね。

docker2000-1

ちなみに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は充分実用的であると言えそうです。

docker2000-2

このことから、1024個以上コンテナを動かしたいときは

  • デフォルトの--net=bridgeモードは不向き
  • --net=bridgeモードを使いたいときはOVSを使うと良い
  • ポートかぶりに気をつける必要があるが--net=hostモードなら動く

ということがわかりました。

Red Hat Enterprise Linux 7とHP ProLiant m300 Server CartridgeならDocker環境も快適に動作します。皆さんも是非、Docker構築にチャレンジしてみてください。