epoll (4)

epoll(4)の Edge Trigger Mode を使用して echo サーバーを作ってみました。epoll(4)は最近になってlinuxに追加されたシステムコールで、Edge Trigger Mode と Level Trigger Mode という2つのモードを持っています。Level Trigger Modeは通常のpoll(2)と同じ様に使用できるのですが、何やらEdge Trigger Modeの方が面白そうなので、こちらを試してみました。

epoll-echo.c

gcc -std=c99 -Wall -O2 epoll-echo.c
./a.out
$ telnet localhost 8080
$ hogehoge

ポイントはやはり Level Trigger Mode を使わずに Edge Trigger Mode を使っている点ですが、正直このソースコードも上手くETモードを扱えている自信が無いです。socket は nonblocking にしてあるのですが、「read(2) または write(2) が EAGAIN を返した後でのみ、イベントを待つ。」という部分を正しく実装出来ていないかも。試した限りだと、readが0を返すと全部EAGAINで終了するので特別な処理は必要無い気がするのですが、もうちょっと調査が必要ですね。

しかしepoll(4)は scalability が高いとの噂を聞いてトライしてみたのですが、どうやってベンチマークを取れば良いんでしょうかね。Apache は (portabilityの為?) select を使っているので、それよりは性能が出る事を確認したい。