大きなデータを送受信する時の性能
前回のプログラムで、より大きなデータ量を指定して実行すると、epoll(2)
のエッジトリガプログラムはアボートします。
# ./epoll_edge_performance 10000 100 1024000 epoll_edge_performance: epoll_edge_performance.c:182: client_session_read_write: Assertion `rtn == data_len' failed. アボートしました
epoll(2)
のエッジトリガでは、ディスクリプタを通しての受信/送信でEAGAINが帰ってきた時、すべてのデータを受信/送信が行われたのか不定です。
少ないデータ量では一回の受信/送信で問題ありませんが、データ量が多い時はすべてのデータが処理できたかを確認する必要があり、そのチェックはアプリケーション側で責任を持たなくてはいけません。
つまり、各ディスクリプタに対し受信/送信を行うデータを自前のデータ領域に一時確保する仕組みを用意する必要があります。
それを踏まえた性能測定を行う場合、エッジトリガだけがその煩雑な処理を行うと性能差に違いが出ることは明白。今回は同機能をepollのレベルトリガおよびpollのプログラムでも同様に実装し測定します。
プログラムは200行を超えているため、ダウンロードして参照してください。
スレッドからデータの送受信を繰り返すので、スレッド切替などの時間が加わり、実際の処理時間とは異なる可能性が高いですが、傾向くらいはつかめると思います。
検証数値は、コネクション数を10,000、処理回数を100回、データ量を102,400バイトとしました。その時の傾向を見ます。
# ./poll_performance_2 10000 100 102400 # ./epoll_level_performance_2 10000 100 102400 # ./epoll_edge_performance_2 10000 100 102400
計測結果は下記の通りです。
今回も、コネクションの時と同様、epollの性能がpollに比べて優れているようです。傾向として、epollのエッジトリガが若干優れているようです。