paizaのオンラインジャッジを支える
Dockerとその周辺
Gino, paiza
吉岡恒夫
http://paiza.jp/
E-Mail: tsuneo.yoshioka@gi-no.jp
Twitter: @yoshiokatsuneo
自己紹介 (吉岡 恒夫)
• 2014年4月 ジョイン
(paizaでpaizaに転職しました)
• paizaのオンラインジャッジシステムの開発
• オンラインコーディング環境paiza.IOの開発
• Linux, Docker, Rails, AngularJS
目的
• paizaでのコンテナ技術の利用の経緯や方法の
紹介
• みなさまがコンテナを活用するきっかけ
527,268
Dockerコンテナ数/月
(2014年12月)
本日の目次
1. paizaとは
2. paizaジャッジシステムの要件
3. Dockerとは
4. paizaジャッジシステムでのDocker利用方法
paizaとは?
paizaとは?
コーディングスキルチェックによる
プログラマ x IT企業
マッチングサービス
スキルチェックのフロー
1. paizaから問題を出す
2. 回答プログラムを書く
3. コードを実行する
4. 出力が正解か判定する
5. 結果(合否)を表示する
ジャッジシステム
ジャッジシステムの要件
1.不正できない(テストコード、他のコードの保護)
2.公平なリソース
3.システムが壊されない
4.自由な環境(複数言語、実機と同様の環境)
5.速い
6.スケーラブル
コード実行環境の安定動作
• 不正できない(テストコード、他のコードの保護)
• 公平なリソース
• システムが壊されない
→コード実行環境の孤立化・仮想化
仮想化の方法
• 仮想マシン(VMware, Xen)
• コンテナ仮想化(Googleは週に20億コンテナ)
•何もしない
→他の人のコードが見える
❌
•ディレクトリのアクセスモード設定を分ける
→CPU等リソース制限がない
❌
仮想マシンとコンテナの違い
ホストマシン
ホストOS
仮想マシン
ゲストOS
プロセス
ホストマシン
ホストOS
仮想マシン
ゲストOS
コンテナ コンテナ
プロセス プロセス プロセス
プロセス プロセス プロセス プロセス
• 仮想マシン: 仮想環境ごとにOSが動作する
• コンテナ: ホストと同一のOS上で動作
仮想マシン コンテナ
仮想マシン v.s. コンテナ
仮想マシン コンテナ
起動
❌
(数分)
⚪︎
(1秒未満)
メモリ
❌
(OS本体)
⚪︎
(必要なプロセス分)
のみ)
OSの自由度
⚪︎
(任意)
❌
(ホストと共有)
コンテナは軽量!
→ジャッジシステムで利用
Linuxコンテナ環境
≒Docker
Dockerとは?
Linux向けの
軽量な
仮想化環境
Docker概要
• Linux上で動作する
コンテナ型仮想化ソフトウェア
• PaaSプロバイダのdotCloudが
ユーザアプリケーションの動作環境として
開発
• Go言語で記述
Dockerのファイルシステム管理
• Union File Systemを利用(Copy on Write)
• ファイルシステムを積み重ねる。読み込みは一番上のレイヤーから、書き込
みは最上位のレイヤーに差分として記録。
• 共通のベースイメージを再利用できる
プロセス
/usr
/home
プロセス
/home
ユーザ環境 ユーザ環境
/homeベース
イメージ
(OS)
コンテナ コンテナ
Docker: リソース制限
• Linuxのcgroupsでコンテナ単位のプロセスグル
ープを作成し、グループ内で利用するリソー
スを制限
メモリ
CPU
メモリ
プロセス
プロセス
プロセス
プロセス
プロセス
プロセス
プロセス
CPU CPU
コンテナ1 コンテナ2
Docker: Namespace隔離
1. プロセス(PID)
2. ネットワーク(virtual Ethernet)
3. ホスト名(UTS)
4. Mount
5. IPC
6. User
(Linuxの機能としてはあるが、Dockerでは利用できない)
Dockerデモ
「100人乗っても大丈夫!」
Dockerホスト
nginx on docker
paiza
ジャッジシステムでの
Dockerの使い方
コード実行の流れ
ベースイメージの作成
(OS, ライブラリ)
実行コンテナ作成
実行コンテナ破棄
コード実行
実行ファイル
実行結果
# docker build
# docker run
# docker kill
# docker rm
CPUの利用管理
• 4コア(8スレッド)
AWS: c3.x2large
• 複数のコードを同時実行
• コード実行時のCPUリソースを公平に!
サービス
CPUの利用管理
コンテナ1 コンテナ2
3 コンテナ4
コンテナ5
CPU-1
CPU-2
CPU-3
CPU-4
コンテナ1
コンテナ2
コンテナ3
サービス
CPUの量が運に左右される
コンテナ単位でCPUを割り当てる
→コンテナのCPU数を制限
→コンテナがCPUを独占
→サービスとコンテナでCPUを分ける
何も考えずに複数のコンテナを同時実行した場合CPU単位でコンテナを割り当てた場合
CPU コア / CPU スレッド
• 個々のCoreは独立して並列実行できる
Quad-Core AMD Opteron processor (front view die, white background)
Attribution: Advanced Micro Devices, Inc. (AMD)
http://en.wikipedia.org/wiki/Opteron#mediaviewer/File:Quad-Core_AMD_Opteron_processor.jpg
Core Core
Core Core
プロセス1
CPUスレッド
(ハイパースレッディング)
• 物理的には1つのCPUコア
• ソフトウェアからは2つの(論理)CPU
• 物理CPUの実行ユニットを効率的に使うことで全体として高速化(30%程度)
物理CPUコア
論理CPU 論理CPU
実行ユニット
実行ユニット
実行ユニット
実行ユニット
プロセス1 プロセス2
ハードウェア
ソフトウェア
CPU CPU
CPUスレッドと公平性
• 1論理CPUを占有しても物理CPUの利用度で速度が変わる
論理CPU
コンテナ1 コンテナ2
実行ユニット
実行ユニット
論理CPU
物理CPUコア
実行ユニット
実行ユニット
コンテナ1
コンテナ1個に物理CPUコア1個(論理CPU2個)
CPU論理CPU
コンテナ3
実行ユニット
実行ユニット
物理CPUコア
実行ユニット
実行ユニット
論理CPU
コンテナ2
メモリの利用管理
• Docker/cgroupsの機能で512MBに制限
• 一部言語では言語単位のメモリ設定が必要
• Java: -Mxオプション
指定しないとメモリ容量から自動的に設定
• PHP: memory_limit設定
プロセスの利用制限
• “fork爆弾”対策
• Docker自身にはfork数の制限はない
• カーネルメモリ制限
→正確に把握できない
→Dockerから直接利用できない
• Linuxのユーザ資源管理(RLIMIT_NPROC)により、
ユーザ単位でプロセス数を制限
• 同時実行するコンテナごとに別ユーザを割り当てる
ディスク領域の制限
• Docker自身にはディスク容量制限機能はない
• ディスクQuotaでユーザ単位のディスク制限
• 同時実行数分のLinuxユーザを作成し、別ユー
ザでコード実行
ネットワークの利用管理
• スキルチェックではネットワークは無効化
→ テストケースの漏洩等防止
• ネットワークを利用するサービス(paiza.io)では
、”bridge”でネットワーク仮想化
• NATのコネクション管理機能(ip_conntrack)を利
用して利用状況を監視
コンテナイメージの読み込み
• ディスクに保持した場合、キャッシュ状況に
よりコード実行速度が変わる
• メモリディスク上に保存
ディスクメモリプロセス
遅い
速い
実行時間の測定
• 正確に測定
→ コンテナ内でtimeコマンド実行
• 改ざん防止
→ timeコマンドはrootで、コードは一般ユーザ
で実行(rootでtimeコマンドを開始後、コード実
行直前にユーザを一般ユーザに変更)
スケールアウト
• キュー(RabbitMQ)を経由して複数のジャッジサーバを接続
• ジャッジサーバを追加し、キューからの読み込みを増やすことでスケー
ルアウト
• ジャッジサーバが停止した場合、キューの再送が行われることで冗長化
APIサーバ キュー
ジャッジサ
ーバ
ジャッジサ
ーバ
ジャッジサ
ーバ
APIサーバAPIサーバユーザ
ジャッジシステムの活用
POH!
(Paiza Online Hackathon)
プログラムを解きながらすすむ
エンジニアの感動ラブストーリー
なぜか勝手に中国語サイトが・・・
動画プログラミング学習
コードを書きながら学習できる
動画学習サービス
paiza.IO
- オンラインコード実行環境 -
ブラウザ上で気軽にプログラムを試せる!
Dockerの利用場面
8つのDocker利用目的
1. サーバ管理を簡単に! => コンテナはどこでも動作!
2. 開発環境依存の問題をなくす! => 開発者全員が同じコンテナを利用できる!
3. 開発・デプロイ環境の同一化! => 開発環境とデプロイ環境を同一コンテナ利用!
4. マイクロサービス化! => サービス間の依存性を減らす!
5. サーバリソースの節約! => 同一物理サーバ上で複数コンテナが軽量動作!
6. デバッグが簡単!=> いつでもスナップショット/コピーをとって解析できる!
7. 複数テナント! => 複数のサービスを1つの物理サーバ上でまとめて動作!
8. デプロイ高速化! => コンテナ起動は一瞬!
高速で軽量仮想化環境が作れることを利用!
Docker以外のLinuxコンテナ
の動向
Rocket
Vagga
LXD
Rocket
• 2014年11月 Ver0.1リリース
• Dockerの主流コントリビュータが開発
• シンプルで独立したツール群
• セキュリティ(署名)
• イメージの分散管理
• オープン
LXD
• 2015年2月 Ver 0.1 リリース
• LXCをベース
• デーモン動作
• 非特権コンテナ
• OpenStackプラグイン
Vagga
• 2015年2月 Ver0.2
• コマンド型(デーモンなし)
• ユーザ権限で動作
• 子プロセスとして動作
• root以外のユーザで動作
まとめ
• Docker/コンテナ技術
• paizaでのDocker利用事例
• 周辺技術
超軽量コンテナを使ってより
快適なサービス、環境に!
以上ありがとうございました!
Gino, paiza
吉岡恒夫
http://paiza.jp/
E-Mail: tsuneo.yoshioka@gi-no.jp
Twitter: @yoshiokatsuneo

paizaのオンラインジャッジを支えるDockerとその周辺

Editor's Notes

  • #4 paiza知ってる? 使ってる? Docker知ってる? 使ってる?
  • #8 サービス、システム、作ってる人もはっぴー、世の中もハッピーに!
  • #11 転職できるかどうかに関わる 入試の例/カンニングできない 自由な環境/言語も環境も制限されすぎない(forkできない/ファイル作れない) 実行時間が毎回同じ 実行時間を元にコードの質(計算量)を判定 多数のアクセスを同時処理 一度の判定では多数のテストデータで確認するため、他のユーザを待たせないようにする 多くのアクセスがある場合にスケールする POHなどのイベント時に台数を増やすことで対応できるようにする 確実に実行結果を返す 混んでいても待っていれば結果を返す 多数の言語に対応 C/C++/Java/PHP/Ruby/Perl/Python… 隔離された同一の実行環境 テストデータや他の人のソースコードにアクセスできない 任意のコードを実行可能 攻撃的なコードが来てもサービスが停止しない
  • #17 使う側
  • #22 $ (set -x; for port in `seq 8000 8100`; do docker run -p ${port}:80 nginx & done) $ boot2docker ssh # watch -n 1 'ps|grep "nginx: master”'
  • #23 Nginx on Docker on Ubuntu on Virtual Box on Mac
  • #30 論理CPUをオフにすればいい? =>AWSではできない
  • #33 ulimitでのファイルサイズ制限を併用
  • #39 中国語版も?
  • #40 中国語版も?
  • #41 中国語版も?
  • #48 http://blog.flux7.com/blogs/docker/8-ways-to-use-docker-in-the-real-world Dockerは速い、簡単
  • #49 Dockerの弱点、特徴
  • #50 現在0.3.1 App Container https://coreos.com/blog/rocket/ Unfortunately, a simple re-usable component is not how things are playing out. Docker now is building tools for launching cloud servers, systems for clustering, and a wide range of functions: building images, running images, uploading, downloading, and eventually even overlay networking, all compiled into one monolithic binary running primarily as root on your server. The standard container manifesto was removed. We should stop talking about Docker containers, and start talking about the Docker Platform. It is not becoming the simple composable building block we had envisioned.