Technology Topics by Brains

ブレインズテクノロジーの研究開発機関「未来工場」で働くエンジニアが、先端オープン技術、機械学習×データ分析(異常検知、予兆検知)に関する取組みをご紹介します。

dockerコンテナのレイテンシ

はじめましてブレインズテクノロジーの貴明です。 今回はDockerにおけるコンテナ間通信のレイテンシについて調べたためその内容について記事にしました。

経緯

「1コンテナ1プロセス」というDockerの原則に基づきコンテナを運用していると、確かに何のコンテナが何の役割を果たしているのか分かりやすいのですが コンテナが増えてくると果たしてそこで発生しているオーバーヘッドがどの程度なのか気になるところ。
基本的にレイテンシが起きるのは、CPU/ディスク/ネットワークとなりますが、今回はまずネットワーク(コンテナ間の通信)において発生しているレイテンシを単純な構成下で計測してみようという試みが本記事となります。
(今回はまず単一ホスト下における計測とし、ホスト間のレイテンシは次回!)

やりたいこと

同コンテナ内から発行されたクエリの処理時間と、別コンテナ経由で発行されたクエリの処理時間差から、コンテナ間通信におけるレイテンシを計測する。
具体的にはPostgreSQLに対してinsert文、およびselect文を複数回実行し、その処理時間差をtimeコマンドにて計測。 (単純なinsert文1,000回, select文10,000回実行) f:id:nakazawa-takaaki:20170817181226p:plain

前提となる環境

  • MacBook Pro (13-inch, 2017,Four Thunderbolt 3 Ports)
  • プロセッサ: 3.1 GHz Intel Core i5
  • メモリ: 16 GB 2133 MHz LPDDR3
  • グラフィックス: Intel Iris Plus Graphics 650 1536 MB
  • OS: MacOS Sierra (10.12.6)
  • Docker version 17.06.0-ce, build 02c1d87
  • docker-compose version 1.14.0, build c7bdf9e
  • Dockerリソース割り当て
    • CPUs: 2
    • Memory: 7.0 GB

結果

結果からいうと以下のようになりました。 やり方によるとは思われますが、今回の試みからはおよそ処理時間にして1%のレイテンシが発生している結果となりました。 実行方法は後述。

処理 同コンテナ処理時間(s) 別コンテナ経由処理時間(s) 処理時間増加比率
insert 11.741 11.908 101.4%
select 6.258 6.351 101.5%

結果詳細

具体的なtimeコマンドによる計測結果は以下の通り。

insert

time type 同コンテナ 別コンテナ経由 処理時間増加比率
real 0m11.741s 0m11.908s 101.4%
user 0m0.000s 0m0.040s -
sys 0m0.110s 0m0.100s 90.9%

select

time type 同コンテナ 別コンテナ経由 処理時間増加比率
real 0m6.258s 0m6.351s 101.5%
user 0m3.160s 0m3.370s 106.6%
sys 0m0.520s 0m0.270s 51.9%

実行方法

まずは以下の内容のDockerfileを用意

FROM postgres:9.6
COPY init.sql /docker-entrypoint-initdb.d/.
COPY create.sh test.sh insert.sql select.sql /tmp/

中でcopyしている各ファイルは以下の通り

  • init.sql: テスト用のDB作成
  • create.sh: テスト用のテーブル作成(今回はint型の1カラムのみとした)
  • insert.sql: テスト用のsql(insert文1,000行)
  • select.sql: テスト用のsql(select文10,000行)

以下のdocker-compose.ymlを用意して

version: '3'

services:
  db:
    build: .
    image: test/postgres:latest
    container_name: db
    ports:
      - "5432:5432"
    tty: true

  outerdb:
    image: test/postgres:latest
    container_name: outerdb
    tty: true

dockerイメージを作成、起動

docker-compose build
docker-compose up -d

sql発行のテストは以下の要領(同コンテナからのsql発行)

docker exec -it db bash
bash /tmp/create.sh
bash /tmp/test.sh localhost

sql発行のテスト(別コンテナからのsql発行)

docker exec -it db bash
bash /tmp/create.sh
exit
docker exec -it outerdb bash
bash /tmp/test.sh db

使ったもの

今回使ったDockerFileやシェルスクリプトなどはgithubへ上げております。