Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

13,797 views

Published on

50万件/月のDockerコンテナ利用の実態を詳しく説明します。

Published in: Software
  • Be the first to comment

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

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

×