糸より軽い(?)繊維の話

 糸より軽い(?)繊維の話

1a10c32e718c2352d76a76f76bc66b57?s=128

Hirotake Kobayashi

May 15, 2019
Tweet

Transcript

  1. 2.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. About me

    小林 寛武  • Server Side Engineer, Tech Lead in RAKSUL • Works for RAKSUL INC. from 2017/02 • printing SCM team • I • I play CHUNITHM hkobayash @hkobayash
  2. 3.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  3. 4.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  4. 5.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「Fibers Are

    the Right Solution」振り返り YouTube に動画が上がっているので、そちらをどうぞ。 資料:Fibers Are the Right Solution
  5. 6.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「Fibers Are

    the Right Solution」振り返り(3行) • Blocking する処理によりスケーラビリティが損なわれる • スケーラビリティ改善のための Fiber と Falcon という選択肢 • Fiber が正しい選択 出典: Fibers Are the Right Solution
  6. 7.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  7. 8.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Fiber とは?

    • Ruby 1.9 で登場 • Enumerator の内部実装ために実装 • Thread(糸) より軽量という意味で、Fiber(繊維)と名付けられた
  8. 9.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「継続」について •

    計算機科学の概念の一つ • プログラムのある時点で、処理されていない残りのプログラムのこと sum = 0 for num in 1..10 do sum += num sum end 1回目のループのここまで処理した場合、 2回目のループ以降の処理のことを「継続」 と呼ぶ
  9. 10.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「継続」と「Fiber」について •

    「継続」を変数として扱えるように(*) 実装したものが 「Fiber」 • 他言語では「co-routine」という名前で実装されている 場合もある 「継続」の概念自体はどの言語にも存在するが、 第一級オブジェクトとして扱えるとは限らない (*) 「第一級オブジェクト」と呼びます
  10. 11.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「非同期処理」と「継続」について 非同期処理とは

    • 待ち (blocking) が発生した時、処理を一時停止して、 別の処理を行うこと • 一時停止から戻ってきたあとの処理は「継続」である 「継続」を第一級オブジェクトとして扱えない言語では、 「継続」の処理を関数に切り出し、引数に渡せば「継続」を扱える
  11. 12.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Falcon •

    非同期型イベント駆動アプリケーションサーバ • 1リクエスト1Fiber • nio4r(New I/O for Ruby): I/O Selector • async: 非同期I/Oフレームワーク • timers: イベントループ用タイマー
  12. 13.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  13. 14.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Falcon を触ってみた

    今回は下記の処理をするWeb アプリケーションを実装し、 puma と falcon で比較。 • 外部(raksul.com)にリクエストを投げ、結果を返す • 1秒 sleep する abを利用して、req/sec を計測。 https://github.com/hkobayash/falcon-sample
  14. 15.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. コード class

    MyApp < Sinatra::Base get '/' do endpoint = Async::HTTP::URLEndpoint.parse('https://raksul.com') client = Async::HTTP::Client.new(endpoint) response = client.get('/') response.read ensure client.close end get '/sleep' do Async::Task.current.sleep(1) 'Wake Up!' end end
  15. 16.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 外部にリクエストを投げる場合 concurrency

    32 64 128 256 512 puma / 1process 128 thread 238.56 req/sec 265.14 req/sec 283.31 req/sec 291.17 req/sec 289.09 req/sec falcon / 1process 176.54 req/sec 190.46 req/sec 189.21 req/sec 188.92 req/sec 181.84 req/sec
  16. 17.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 1秒 sleep

    する場合 concurrency 32 64 128 256 512 puma / 1process 128 thread 31.95 req/sec 63.84 req/sec 127.57 req/sec 127.42 req/sec 127.55 req/sec falcon / 1process 31.92 req/sec 63.78 req/sec 127.39 req/sec 252.63 req/sec 502.04 req/sec
  17. 18.

    AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. まとめ •

    コードそのままで falcon を使うのは(まだ)難しそう • ドキュメントや例が(まだ)少ないため、どのようなコードを書け ば効率がよいのかよくわからい • Auto fiber にも期待