Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ngx_mrubyとfiberの話 (未完成版)
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ryo Okubo
January 24, 2018
Programming
2
320
ngx_mrubyとfiberの話 (未完成版)
ngx_mruby のかんたんな紹介と、 fiber を組み込んで色々やりたかったけど挫折してる話
Ryo Okubo
January 24, 2018
Tweet
Share
More Decks by Ryo Okubo
See All by Ryo Okubo
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
3
1.4k
メルカリ・メルペイの成長を支える データ基盤とはどんなものか
syucream
7
7.2k
バッチとストリーミング、それぞれの障害に立ち向かう
syucream
3
3.8k
How Scala works at Mercari
syucream
2
1.1k
Production-ready stream data pipeline in Merpay, Inc
syucream
2
13k
データとML周辺エンジニアリン グを考える会 #2 イントロ
syucream
0
660
マイクロサービスにおける ログ収集の課題と取り組み
syucream
7
2.8k
Stream Data Pipeline for Microservices in Merpay
syucream
6
1.3k
メルペイにおける、マイクロサービスに寄り添うログ収集基盤 / Microservices-frendly Data Pipeline
syucream
0
18k
Other Decks in Programming
See All in Programming
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
460
CSC307 Lecture 12
javiergs
PRO
0
450
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
360
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
3
330
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
490
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
120
DSPy入門 Pythonで実現する自動プロンプト最適化 〜人手によるプロンプト調整からの卒業〜
seaturt1e
1
340
朝日新聞のデジタル版を支えるGoバックエンド ー価値ある情報をいち早く確実にお届けするために
junkiishida
1
270
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
12
7.1k
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
200
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
200
RAGでハマりがちな"Excelの罠"を、データの構造化で突破する
harumiweb
5
1.2k
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
66k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
470
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
620
30 Presentation Tips
portentint
PRO
1
240
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
140
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
130
Transcript
ngx_mrubyとfiberの話 (未完成版) @syu_cream
whoami • @syu_cream • 仕事で Go, Scala, mrubyは趣味 • mruby
の実装に関する同人誌書いた ◦ https://www.amazon.co.jp/dp/B06XZ9LXSB • 作った mruby 関連プロダクト ◦ mruby-rspec ◦ mruby-serverspec ◦ mruby-k2hash ◦ mruby-rocksdb ◦ ts_mruby(mruby extension for Apache TrafficServer)
今日の話 • この会のテーマを見ると... • ngx_mruby, fiber 周りで試行錯誤した話需要あるかも? • と思ったのでそんな感じの話します
ngx_mruby • 設定や簡単なロジックを mruby で拡張可能にする nginx モ ジュール ◦ https://github.com/matsumotory/ngx_mruby
• ngx_mruby 利用例: ◦ ランダムに upstream を切り替える ◦ 特定 IP アドレス以外からのアクセスを遮断する
ngx_mruby 利用の具体例 • User-Agent が空なリクエストに400を返す ◦ 以下はnginx.confにインラインで書いてるけど別ファイルに分離可能
ngx_mruby における非同期処理 • 依存 mrbgems で容易に I/O でブロックする ◦ ノンブロッキング
I/O のサポートはしていない ◦ なので性能面でつらい場面が出る可能性がある • h2oでも試行錯誤してた ◦ https://www.slideshare.net/ichitonagata/h2o-x-mruby-72949986 • ngx_lua はノンブロッキング処理を頑張っている ◦ ngx.sleep, ngx.location.capture ◦ ngx.socket.tcp, ngx.socket.udp ◦ さらに気になる人は “nginx実践入門” もチェック!
ngx_mrubyでもノンブロッキングI/Oしたい! • nginx を使う以上イベント駆動の恩恵を受けたい • lua ならコルーチンで処理の継続ができる • mruby の場合...
継続可能な処理は fiber で表現可能 • まずノンブロッキング sleep を実装してみる ◦ 実用性で言うと subrequest が欲しいが難易度が高い ◦ 第一歩は簡単で分かりやすい目標にする
ngx_mruby fiber • ngx_mruby で fiber サポートを試みた ◦ まずは mruby
の実行コードを fiber に包んで VM に実行させる ◦ その後 fiber の具体利用例として sleep を実装する ▪ Nginx::Async.sleep という名前付けた
事前調査・学習の流れ • mruby の ソースコードをざっくり読む ◦ include/ 以下のヘッダと必要なら src/, mrbgems/mruby-fiber/
• ngx_mruby のソースコードを読む ◦ 特に src/http/ngx_http_mruby_module.c ◦ VM の実行部分を触ることになるので mrb_run() 周りを • echo-nginx-module のソースコードを読む ◦ ノンブロッキング sleep を実装している module ▪ えっ、 echo module って何だよ(哲学) ▪ src/ngx_http_echo_sleep.c が参考になった • nginx のソースコードをざっくり読む ◦ 上記で解決しなかった場合はサボらない
実装 • forkした以下のリポジトリにあります ◦ https://github.com/syucream/ngx_mruby • やったこと ◦ mrb_run() で実行する
RProc 構造体の値を fiber でラップ ◦ fiber を yield されるまで実行 ◦ Nginx::Async.sleepのC関数内で yield して nginx の timer をセット ▪ ngx_add_timer() にハンドラと秒数を渡す ◦ ハンドラ内で fiber を resume & nginx のイベントを進める ▪ ngx_http_core_run_phase() 経由で操作
Nginx::Async.sleep の動作 • コード例 ◦ 上がブロックする版、下がしない版 • 実際の動作 ◦ デモします
ngx_mruby によるノンブロッキング処理の展望 • sleep だけでは用途は限定される • subrequest が扱えるとやれることが多くなる ◦ ACL
設定を他 HTTP サーバに分離してそれを参照など • ngx_lua の ngx.socket.tcp など欲しいが、険しい道 ◦ mruby-redis とか使いたいライブラリに手を入れるの? ◦ 片っ端から ngx_mruby 用の修正入れるのは高コスト • Thread Pool と連携してなにかできないかな? ◦ https://www.nginx.com/blog/thread-pools-boost-performance-9x/ ◦ ブロックする処理の実装は無理して変更しない ◦ Thread Pool に投げるようにして、終わったら resume する
実装でハマった(ハマってる)箇所1 • mruby の fiber 操作の C 関数がつらい ◦ yield/resume
関数の 2 つしかない ◦ new する C 関数が無いので funcall 経由でオブジェクト生成 ▪ proc オブジェクトと fiber class の mrb_value を用意 ▪ mrb_funcall_with_block() に渡してオブジェクトを得る ◦ その後 mrb_fiber_resume() するも... • 本スライドでは Fiber を Proc オブジェクトでラップして Proc#call 経由で操作するメソッドを Ruby で実装☺
実装でハマった(ハマってる)箇所2 • 生成された mruby のコードの OP_STOP 命令問題 ◦ yield した後もちろん別の
mruby コードが実行される可能性ある ◦ そしてそのコードは末尾に OP_STOP を持つ ▪ mrb_generate_code() で生成されたコードは持つはず ◦ OP_STOP で VM が停止し、 fiber が resume できない事態に! ◦ 一旦 OP_STOP を OP_RETURN に置換するという荒業で対応 ▪ 過去に h2o がこの対策取ってたらしい ▪ 本来どうするべきなんだろうか ...
実装でハマった(ハマってる)箇所3 • 特定ハンドラでしか動作確認できていない ◦ 現状、 rewrite, access handler でしか動作しない ◦
content handlerとかで動かしたら死ぬ • nginx の理解がそもそも足りていない気がする
おわりに • ngx_mrubyの試行錯誤コード読み書き話ウケるかも! • と思ったのでそんな感じの話します • と意気込んだものの絶賛WIPです • それでも何かの参考になれば幸いです