よく C10K 問題とかいって epoll(7) の話が出てきて select(2) 遅いね poll(2) 遅いねってなるんだけど、正直なところ、これらのシステムコールを実際に使ってコードを書いてみたひとはどのくらいいるのだろう。ましてや eventpoll が何やってるか知っている人はそんなに多くないんじゃないだろうか。もう O(n) だの O(1) だのって煙に巻かれるのもうんざりだ。 というわけで、2.6.26 の fs/eventpoll.c のコードを読んでみた。正直 Linux カーネルにすごく詳しいわけでもないので、誤りがあったら適宜突っ込んでもらえると幸いです。 前提知識として VFS モジュールがどうなってるかとかは LinuxのFSモジュールを書いてみる LinuxのFSモジュールを書いてみる (その2) のソース中のコメントを追ってもらえればと。 登場する構造体 e
epoll(2)とselect(2)の計算量 研究室でid:yama6がepollとか言っていて、mixi Engineers' Blog さんの「Linux Programming、epollの話」を思い出した。 パフォーマンスの方はselect(2)とpoll(2)のtime complexityがO(n)に対しepollはO(1)と無視のできない性能の差を実現しています。 これこれ、書こうとして忘れてた。僕の理解だとepoll(2)はO(n)でselect(2)がO(n^2)です。この差はsignificantですよ! 例えば1万個のソケットを管理しているとします。で、ソケットが1個づつ順番に読み込み可能になるという最悪のシチュエーションを考えて見ます。select(2)だと10000 * 10000のループが回ります。epoll(2)だと10000 * 1回のループが回ります。 そ
x��}�wS��竟�+N佑� ?か�Mh? $e� �c�3i���tek�%U� �L��杜 _V 義86愼 � rh 2i咾�i�+唏i翠��鮎女9�>t壚GH�B� 螭�>𧚄熟漱楹烤炸 d�� :z�� 虵跏�W 槐Z:査鱁侵�k��靮{'�8� �^_W���-❺�X訳tu�9sㇵ��3�闕:q� k � �|*^�L -�y� L���=-�〻x AS 隘�*�5�wnN��f跑�]碯�~⑧��擯�iQ �}�| �g3E-S樮rB宥�T寓T*O-u��b拂 6�3�仲�� 琢仮��樮�x潤 囉 燃C天㊸ �薫T 縕&��-I���褓��]*���'咢ɔ�n�>GG�粫 =炬� �P� �c列� c��〃_��G亘 i��NY再 )�%�g Z,�蹈���.�T� 資*J�F ��&J�ヹH���)])] �.}(耔v頚z�h�hu�\i侯�|/=(薀諮�!彤Tz �
エッジトリガのメリットとしては、「データが貯まった状態で処理を後回ししても起こされない」というのもあるみたいだけど、これはEPOLLONESHOTというオプションを使うとレベルトリガでも実現可能。 epollであえてエッジトリガを使うとすれば、「ノンブロッキングI/Oでいつも最後までデータを読んでるから、レベルトリガはただの無駄だよねー」とかいうときの気持ちの問題ではなかろうか。 http://d.hatena.ne.jp/nishidakeisuke/20080703/p1 エッジトリガとレベルトリガで、コーディングの差が大きくなるのは、むしろデータを書く場合なんじゃないのかなぁ。レベルトリガだと、 send(2) が EAGAIN を返したら epoll に fd を登録 アプリケーション側のバッファが空になったら、epoll から fd を削除 というコードを書かないといけない (と
Section: Linux Programmer's Manual (7) Updated: 2008-02-28 Index JM Home Page roff page 名前 epoll - I/O イベント通知機能 書式 #include <sys/epoll.h> 説明 epoll は poll(2) の一種であり、エッジトリガインタフェースと レベルトリガインタフェースのどちらとしても使用することができ、 監視するファイルディスクリプタの数が多い場合にも使用できる。 epoll 集合を設定したり制御したりするために、 次の 3 つのシステムコールが提供されている: epoll_create(2), epoll_ctl(2), epoll_wait(2). epoll 集合は epoll_create(2) で作成されるファイルディスクリプタに接続される。 ファイルディスクリプタ
映画やプログラムについて日々赤裸々に綴る。日本語でlibeventの解説をしているページが少ないので、使用方法などメモ。 ◇インストール http://www.monkey.org/~provos/libevent/ libevent-1.3e.tar.gz をダウンロード ◇コマンド ./configure --prefix=/usr/local/libevent-1.3e make make install ◇簡説 configure 時にシステムにおいて、epoll, select, poll, kqueueなどの通知メカニズムが使えるか調べます。 そして使用出来るものの中からもっともscalableな通知メカニズムを選択します。 scalableとは、大規模化してもコストなどが規模に比例して増加しないさまのこと。引用 APRとは違い、
お久しぶりです、初めての日本の夏に圧倒されているトールマエサカです。 今日はLinuxにおけるネットワークプログラミング関連のネタです。分散データベースサーバの開発過程で最近よくLinuxのepollというイベントハンドリング機能を使っています。これがまた優秀な機能なので紹介します。 このContextでいうイベントハンドラーはサーバがクライエントのリクエストを処理するためのメカニズムです。イベントの感知と通知は大雑把にいうと以下の三つの処理で構成されています: 一つもしくは複数のディスクリプタを監視 ディスクリプタの準備が整うまでハチ公のごとくひたすら待ち続ける 準備が整ったディスクリプタの通知 アプリケーションでの実装は一昔までselect(2)、もしくはpoll(2)というシステムコールで行われていました。二つとも役目は同じですがselect(2)の場合、kernelをいじらない限り
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く