Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Flex-SC threads

Introduction to Flex-SC threads

A brief explanation of Flex-SC threads, a very fast pthead library aimed to heavy parallel workloads

Satoru Takeuchi

October 12, 2017
Tweet

More Decks by Satoru Takeuchi

Other Decks in Programming

Transcript

  1. はじめに • 本書の目的 ◦ “FlexSC: Flexible System Call Scheduling with

    Exception-Less System Calls”[1]という論文に記載されている FlexSC-Threadsの紹介 • 執筆動機 ◦ FlexSC-Threadsは機能の効果、実装ともにかっこいいので、多 くの人に知ってもらいたかった ◦ 元論文を読むのに必要なOS、とくにスケジューラ)の知識が無く ても読める、副読本を作りたかった 2
  2. FlexSC-Threadsとは: 効果と適用範囲 • 性能向上の例 ◦ Apache: 116%Up ◦ MySQL: 40%Up

    ◦ BIND: 105%Up • 性能向上が見込める条件 ◦ スレッド数が多い ◦ システムコールの呼び出し頻度が高い 6
  3. 前提知識(2/3): スレッドモデル • スレッドを実装する方法 ◦ 1x1モデル: スレッドとカーネル内のスケジューリング対象が1:1 に対応 ▪ glibcのデフォルトpthreadライブラリ(NPTL)はこれ

    ◦ Mx1モデル: 同、M(スレッド数):1に対応 ▪ 1CPUのFlexSC-Threadsはこれ ◦ MxNモデル: 同、MxNに対応 ▪ 複数CPUのFlexSC-Threadsはこれ • どれも一長一短 • 以降、1x1とMx1について図解説明 13
  4. 前提知識(2/3): 時分割によるプロセス の並行処理 • 1CPU上に複数プロセスが存在する場合、各プロ セスが一定時間ごとに、順番にCPUを使用 • 例) p1, p2,

    p3の3つのプロセスが存在 • 全プロセスがCPUを使う処理のみ実行 CPU上で動作 中の処理 時刻経過 p1 p2 p3 p1 p2 14
  5. 前提知識(2/3): 1x1モデルにおけるス レッドの並行処理 • 例) 3スレッドt1, t2, t3が存在する場合 ◦ 全スレッドがCPUを使う処理のみ実行

    • 結果は複数プロセスが存在する場合と同じ ◦ そのたびに性能劣化 CPU上で動作 中の処理 カーネルモード t1 ユーザモード t2 t3 t1 t2 時刻経過 16
  6. 前提知識(2/3): Mx1モデルにおけるス レッドの並行処理 • 例) 3スレッドt1, t2, t3が存在する場合 ◦ 全スレッドがCPUを使う処理のみ実行

    • CPU上で別スレッドが動き出す際に状態遷移が発 生しない ◦ 理由: Mx1モデルはユーザ空間でスレッドのスケジューリングを している CPU上で動作 中の処理 カーネルモード t2 ユーザモード 時刻経過 t1 t3 t1 t2 17
  7. 前提知識(3/3): システムコールのラッ パ関数 • 通常、システムコールはlibcのラッパ関数を介して呼び出す • 直接呼び出すにはアセンブリ言語を使う必要があり、移植性が無い ユーザプロセス 直接呼び出し 移植性なし

    アーキテクチャ依存 アセンブリ言語で書く libcのラッパ関数呼び出し Cで書く libc経由で呼び出し 移植性あり アーキテクチャ依存 アセンブリ言語で書く libcのラッパ関数 18
  8. 動作のしくみ: NPTLにおける複数ス レッドの動作 • スレッドモデルは1x1 • 例) 複数スレッドt1, t2, t3がCPU上で動作するたびにシステムコー

    ルを発行 ◦ 簡単のため、システムコールがブロックされる場合は考えない • 大量の状態遷移が発生 CPU上で動作 中の処理 カーネルモード(スケジューラ) ユーザモード 時刻経過 t1 カーネルモード(システムコール処理) t1 t2 t2 t3 t3 t1 t1 20
  9. 動作のしくみ: FlexSC-Threadsにおけ る複数スレッドの動作 • 例) 複数スレッドt1, t2, t3がCPU上で動作するたびに システムコールを発行 •

    状態遷移の数が激減することによって性能向上 ◦ Mx1モデルなので、CPU上で動作するスレッドが変わっても状態 遷移無し ◦ システムコールの発行は3回に1回で済む CPU上で動作 中の処理 カーネルモード(スケジューラ) ユーザモード 時刻経過 カーネルモード(システムコール処理) t1 t2 t3 t1 t2 t3 t1 t2 t3 t1, t2, t3用の システムコールを 連続実行 22
  10. 実装: 概要 • 前述のしくみを実現するために、以下の作り込み が必要 ◦ カーネル: 新規システムコールの追加 ▪ 初期化用

    ▪ システムコールの連続実行用(以下、連続実行用と記載) ◦ FlexSC-Threads: 新規作成 ▪ ロード時に初期化用システムコールを呼び出す ▪ システムコールのラッパ関数 ▪ pthreadライブラリ関数 25
  11. 実装: システムコールのラッパ関数 キューにシステムコールのパラメタを書いたエントリを挿入 キューが一杯? 連続実行用システム コールを呼び出す 他に実行可能な スレッドが存在? 他のスレッドにCPU 実行権を明け渡す

    自身の戻り値を必要箇所に書き込んだ上で次の処理に進む システムコールが完了済の スレッドを全て起こす 他のスレッドの システムコールが 完了済? Yes No No Yes No Yes 28
  12. 実装: FlexSC-Threadsの動的リンク • 動的リンクをすれば準備完了 ◦ 連続実行用システムコールが使用可能になる ◦ libc提供のラッパ関数を上書き ◦ pthreadライブラリ関数を上書き

    • プログラムのバイナリ変更は不要 • 以下の場合はFlexSC-Threadsの恩恵を受けられ ない ◦ libcを静的リンクしている ◦ libc提供のラッパ関数経由でシステムコールを呼んでいない 30
  13. まとめ: ユーザから見た変化 • libcのインターフェイスは全く変更が無いため、プロ グラムは変更不要 ◦ スレッドモデルの変更に伴い/proc/<pid>/以下の見え方が変わ るため、そこに依存するような処理をしている場合には考慮が必 要 •

    スレッドライブラリの入れ替えだけで性能向上 ◦ システム標準のlibc(通常glibc)が対応していれば、環境変数の 設定など、より簡単な方法でFlexSC-Threadsを使用できるよう になるかも 32
  14. 参考文献 1. Livio Soares and Michael Stumm. FlexSC: Flexible System

    Call Scheduling with Exception-Less System Calls http://www.cs.cmu.edu/~chensm/Big_Data_rea ding_group/papers/flexsc-osdi10.pdf 2. Github ID “spinlock”. implements flexsc (flexiable system call, OSDI '10) on ubuntu https://github.com/spinlock/flexsc 35