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

Avatar for Satoru Takeuchi

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