SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ファイルディスクリプタについて

ファイルディスクリプタについて(6)
~多重I/Oの性能とC10K問題

第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

大きなデータを送受信する時の性能

 前回のプログラムで、より大きなデータ量を指定して実行すると、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バイトとしました。その時の傾向を見ます。

図5のデータ取得方法
# ./poll_performance_2 10000 100 102400
# ./epoll_level_performance_2 10000 100 102400
# ./epoll_edge_performance_2 10000 100 102400

 計測結果は下記の通りです。

図5
図5

 今回も、コネクションの時と同様、epollの性能がpollに比べて優れているようです。傾向として、epollのエッジトリガが若干優れているようです。

次のページ
データ管理をした時の性能

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ファイルディスクリプタについて連載記事一覧

もっと読む

この記事の著者

赤松 エイト(エイト)

(株)DTSに勤てます。WebアプリやJavaやLL等の上位アプリ環境を密かに憧れつつも、ず~っとLinuxとかHP-UXばかり、ここ数年はカーネル以上アプリ未満のあたりを行ったり来たりしています。mixiもやってまして、こちらは子育てとか日々の日記メインです。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4830 2010/03/05 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング