Your SlideShare is downloading. ×
0
イベント駆動と
ノンブロッキング
尾形 鉄次 (OGATA Tetsuji)
Twitter: @xtetsuji
2013/8/31 Hokkaido.pm #10
自己紹介
• 尾形 鉄次 (OGATA Tetsuji)
• Twitter: @xtetsuji
• Blog: http://post.tetsuji.jp/
• Hokkaido.pm は #5から6回連続参加中
• 北海道とPerlが好...
今回は私の勉強不足
とその 回の話です
会社の部内勉強会で
• 後輩と部内勉強会でAnyEvent::IRC::Client
とTwiggyの勉強をしていたときの話
• ライブコーディングでAE::timerなどとも
連携してイベント駆動を実感
• 後輩「今つくっているIRCボットが...
勉強会中の模索
• 後輩「色々調べてはいるのですが…」
• 僕「何かがブロッキングしてる?」
• 後輩「ところでブロッキングとかノン
ブロッキングとかイベント駆動とかっ
て具体的に何なんでしょう?」
あ、知ったかぶり
してて分からない…
こっそりググる
I/Oブロッキング
• ブロッキングの代表例、I/O
• ググって見ても出てくるのはこれ
• 以前のYAPCでAnyEventが流行った時、
IO::Socket::INETを使っている事例系で
「それブロ(ry」と言われていたやつ
先輩=私の回答
• 一つのプロセスがマルチタスクをして
いるように見せかけるために、時間を
細かくスライスして、それ用にタスク
を分割してやらせているんだよきっと
• 「それ用」なのがノンブロッキング、
そうじゃないやつがブロッキング
色々実験
• AE::timerのcbでsleep 10; とか書いてみる
• IO::Socket::INETで待たされるコードを
わざと書いてAnyEvent全体を止めてみる
• 普通にIO::Handleで巨大ファイルを複数
開いて渾然一...
コードリーディング
• 後輩「AnyEventのコード読めば分かる
んじゃないですかね?」
• 僕「そうだね(うわ、マークレーマン
氏のコード、読むの大変そうだ)」
• でも読む
AnyEvent 読む
• AnyEvent.pm から流し読みする
• 僕「根底は while(1) じゃないかな」
• AnyEvent/Loop.pm に迷いこむ
AnyEvent::Loop 読む
• なんとなく分かったこと
• 最も解像度の高い場合でも1ミリ秒の
時間でスライスしている
• I/Oや時間等のイベントを分割管理
•sub run { one_event while 1; }
AnyEvent::Loop 読む
• 時間取得呼び出し(timesシステムコール)
をなるべく抑えるっぽい絶妙な仕組み
• 効率化なのか、すごいリファレンス
• 慣れないと分からないビット演算
• 読んで理解すれば充実感にひたれる?
ここまでのまとめ
• 「イベント駆動」は並列処理・マルチ
タスクを実現するための手法の一つ
• その他、「fork」や「スレッド」など
• マルチCPUとかの知識は別として、OS
レベルで何らかの並列処理はある
イベント駆動
ウェブサーバ
イベント駆動ウェブサーバ
• 最近はイベント駆動ウェブサーバ全盛
• C10K問題への対処
• Nginx、Perl製各種ウェブサーバの登場
• prefork MPMが常識だったあのApacheも
event MPMを2.4から正式リリース
Apache prefork MPMの
頭打ち問題
Nginx HttpPerlModule
• 早くも現在最新バージョン1.4
• 0.8時代はEmbeddedPerlModuleと呼ばれ
ていた
• mod_perl1の書法の影響が見られる
• 今の名前の通り、HTTPに特化したもの
Nginx HttpPerlModule
Nginx HttpPerlModule
• Known Problemにイベント駆動ならでは
の注意点が書いてあるけど問題点では
ないと思う
• ネットワークI/Oで止めないように気を
つけるのは昨今の他のウェブサーバと
同様 → ジョブキュ...
Nginx HttpPerlModule
• Nginx(0.8時代?)に本体にパッチをあてて
PSGI対応するものはある
• 簡単なPSGI実装であればHttpPerlModule
でできるのでは → 探したけどなかった
Apache event MPM
• 2.2でexperimental、2.4で正式版に
• prefork MPMだと越えられないC10K問題
などの壁に立ち向かう、Nginxへの対抗
• ベンチマークを取った人の評判だと、
まだ期待したほど...
Apache event MPM
and mod_perl
• 検討材料となりうる実績は無いはず
• mod_perlがApache 2.4対応していない
• 注意点はNginx HttpPerlModuleと同じか
• これでConnecti...
宣伝: ModPerl::PSGI
ModPerl::PSGI
• mod_perl2で書かれたのPSGI実装
• Plack::Handler::Apache2をベース
• P::H::A2で対応していないprefork以外の
MPMへの対応や、Perl本体とmod_perlの...
宣伝: ModPerl::PSGI
• Middleware等の資産活用のためにPlack
依存しないWAFではそのまま使える
• MojoliciousではPSGI環境として使える
• 実績が出たらP::H::A2へcontribute予定
workerモデル
• preforkとスレッドやイベント駆動との
ハイブリッドモデル
• Nginxや最近のPerl製ウェブサーバでは
このモデルを採用している
• Twiggyやmorbo等は単一プロセスなので
少し注意しておくべき
ちゃんと理解したい
• Linuxプログラミングインタフェースを
読まないといけないかもしれない
• イベント駆動以前に、forkとかスレッド
に関しても造詣を深めておきたい
• 新たなイベント駆動サーバの時代に向
けて理解しなきゃいけませんね
まとめ
• イベント駆動をちゃんと理解するのは
意外に難しいけど、楽しい
• イベント駆動の考え方はウェブプログ
ラマーに必須になっている(e.g.Ajax)
• 続きはGitHubやブログ、YAPCで!
ご清聴
ありがとうございました
Upcoming SlideShare
Loading in...5
×

イベント駆動とノンブロッキング #hokkaidopm

2,984

Published on

2013/08/31 に行われた「Hokkaido.pm #10」 http://atnd.org/events/41429 で20分トークしたスライドです。

Published in: Technology
1 Comment
5 Likes
Statistics
Notes
  • とてもわかりやすい。資料を見ているだけでOgataさんがどういう風に話しているのかイメージ出来る。

    しかし正直な所、イベント駆動がくるのは少し先なのか、もしくはエンジニアのエゴなのか、見極めが難しい所だと思っています。

    それを「どうコンテンツ・プロダクトにしていくか」が少なくとも今のところ僕の中にはない。

    しかしノンブロッキングで通信が出来るのは明らかに技術の進歩。
    もっともっと簡単に自然に出来るようになると利用される事も増えるのでは。と思ってます。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
2,984
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
6
Comments
1
Likes
5
Embeds 0
No embeds

No notes for slide

Transcript of "イベント駆動とノンブロッキング #hokkaidopm"

  1. 1. イベント駆動と ノンブロッキング 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2013/8/31 Hokkaido.pm #10
  2. 2. 自己紹介 • 尾形 鉄次 (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/ • Hokkaido.pm は #5から6回連続参加中 • 北海道とPerlが好きな、地元が北海道の人
  3. 3. 今回は私の勉強不足 とその 回の話です
  4. 4. 会社の部内勉強会で • 後輩と部内勉強会でAnyEvent::IRC::Client とTwiggyの勉強をしていたときの話 • ライブコーディングでAE::timerなどとも 連携してイベント駆動を実感 • 後輩「今つくっているIRCボットが時々 応答しなくなることがあるんです」
  5. 5. 勉強会中の模索 • 後輩「色々調べてはいるのですが…」 • 僕「何かがブロッキングしてる?」 • 後輩「ところでブロッキングとかノン ブロッキングとかイベント駆動とかっ て具体的に何なんでしょう?」
  6. 6. あ、知ったかぶり してて分からない…
  7. 7. こっそりググる
  8. 8. I/Oブロッキング • ブロッキングの代表例、I/O • ググって見ても出てくるのはこれ • 以前のYAPCでAnyEventが流行った時、 IO::Socket::INETを使っている事例系で 「それブロ(ry」と言われていたやつ
  9. 9. 先輩=私の回答 • 一つのプロセスがマルチタスクをして いるように見せかけるために、時間を 細かくスライスして、それ用にタスク を分割してやらせているんだよきっと • 「それ用」なのがノンブロッキング、 そうじゃないやつがブロッキング
  10. 10. 色々実験 • AE::timerのcbでsleep 10; とか書いてみる • IO::Socket::INETで待たされるコードを わざと書いてAnyEvent全体を止めてみる • 普通にIO::Handleで巨大ファイルを複数 開いて渾然一体と読めない事を確認
  11. 11. コードリーディング • 後輩「AnyEventのコード読めば分かる んじゃないですかね?」 • 僕「そうだね(うわ、マークレーマン 氏のコード、読むの大変そうだ)」 • でも読む
  12. 12. AnyEvent 読む • AnyEvent.pm から流し読みする • 僕「根底は while(1) じゃないかな」 • AnyEvent/Loop.pm に迷いこむ
  13. 13. AnyEvent::Loop 読む • なんとなく分かったこと • 最も解像度の高い場合でも1ミリ秒の 時間でスライスしている • I/Oや時間等のイベントを分割管理 •sub run { one_event while 1; }
  14. 14. AnyEvent::Loop 読む • 時間取得呼び出し(timesシステムコール) をなるべく抑えるっぽい絶妙な仕組み • 効率化なのか、すごいリファレンス • 慣れないと分からないビット演算 • 読んで理解すれば充実感にひたれる?
  15. 15. ここまでのまとめ • 「イベント駆動」は並列処理・マルチ タスクを実現するための手法の一つ • その他、「fork」や「スレッド」など • マルチCPUとかの知識は別として、OS レベルで何らかの並列処理はある
  16. 16. イベント駆動 ウェブサーバ
  17. 17. イベント駆動ウェブサーバ • 最近はイベント駆動ウェブサーバ全盛 • C10K問題への対処 • Nginx、Perl製各種ウェブサーバの登場 • prefork MPMが常識だったあのApacheも event MPMを2.4から正式リリース
  18. 18. Apache prefork MPMの 頭打ち問題
  19. 19. Nginx HttpPerlModule • 早くも現在最新バージョン1.4 • 0.8時代はEmbeddedPerlModuleと呼ばれ ていた • mod_perl1の書法の影響が見られる • 今の名前の通り、HTTPに特化したもの
  20. 20. Nginx HttpPerlModule
  21. 21. Nginx HttpPerlModule • Known Problemにイベント駆動ならでは の注意点が書いてあるけど問題点では ないと思う • ネットワークI/Oで止めないように気を つけるのは昨今の他のウェブサーバと 同様 → ジョブキューへ依頼!
  22. 22. Nginx HttpPerlModule • Nginx(0.8時代?)に本体にパッチをあてて PSGI対応するものはある • 簡単なPSGI実装であればHttpPerlModule でできるのでは → 探したけどなかった
  23. 23. Apache event MPM • 2.2でexperimental、2.4で正式版に • prefork MPMだと越えられないC10K問題 などの壁に立ち向かう、Nginxへの対抗 • ベンチマークを取った人の評判だと、 まだ期待したほどのパフォーマンスは 出ないらしい
  24. 24. Apache event MPM and mod_perl • 検討材料となりうる実績は無いはず • mod_perlがApache 2.4対応していない • 注意点はNginx HttpPerlModuleと同じか • これでConnectionフェーズを書いたらど うなるか興味深くはある
  25. 25. 宣伝: ModPerl::PSGI
  26. 26. ModPerl::PSGI • mod_perl2で書かれたのPSGI実装 • Plack::Handler::Apache2をベース • P::H::A2で対応していないprefork以外の MPMへの対応や、Perl本体とmod_perlの コア以外への依存をなくす等の意欲作
  27. 27. 宣伝: ModPerl::PSGI • Middleware等の資産活用のためにPlack 依存しないWAFではそのまま使える • MojoliciousではPSGI環境として使える • 実績が出たらP::H::A2へcontribute予定
  28. 28. workerモデル • preforkとスレッドやイベント駆動との ハイブリッドモデル • Nginxや最近のPerl製ウェブサーバでは このモデルを採用している • Twiggyやmorbo等は単一プロセスなので 少し注意しておくべき
  29. 29. ちゃんと理解したい • Linuxプログラミングインタフェースを 読まないといけないかもしれない • イベント駆動以前に、forkとかスレッド に関しても造詣を深めておきたい • 新たなイベント駆動サーバの時代に向 けて理解しなきゃいけませんね
  30. 30. まとめ • イベント駆動をちゃんと理解するのは 意外に難しいけど、楽しい • イベント駆動の考え方はウェブプログ ラマーに必須になっている(e.g.Ajax) • 続きはGitHubやブログ、YAPCで!
  31. 31. ご清聴 ありがとうございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×