4月 5th, 2010

Sendfileのパフォーマン゜

Posted in Apache, Linux by admin

 Apacheのディレクティブぜ EnableSendfileというものがある。これはファイル・ディスクリプタ間のデータコピーシステムコールであるsendfileを、httpdが使用するかどうかを制御するものです。パフォーマンス? の利点について、Apacheドキュメントぜ Linux manページを抜粋しました。

Apache2.2のドキュメントより

例えば静的なファイルの配送のように、リクエストの処理にファイルの途中ぜ
データのアクセスを必要としないときには、Apache ぜ  OS が サポートしていれぜ
ファイルを読み込むことなぜ  sendfile を使ってファイルの内容を送ります。

Linux manページより

このコピーはカーネル内で? ゜ れるので、 sendfile() は、 read(2) ぜ  write(2)
を組み合゜ せるよりも効? がよい。 read(2) や write(2) ではユーザ空間との間ぜ
データの転送が必要となるからである。

 まずぜ Apacheを除? し、システムコールのレベルぜ read/writeぜ sendfileの性能差を比較してみました。比較方? は、ソケット経由で? 定サイズの画? ファイルをクライアント側に配送するという単純なサーバプログラムを組んで? 較しています。プログラムの? 更点は以下の部分になります。Linuxカーネルは「2.6.18-53.el5 x86_64」、計測ツールは「valgrind-3.2.1/callgrind_annotate-3.2.1」です。

read/write

while( 1 )
{
	in_read_size = read( in_fd, buf, sizeof(buf) );
	if( read_size > 0 ){
		write( socket, buf, in_read_size);
	} else {
		break;
	}
}

sendfile

in_size = sendfile( socket, in_fd, &offset, stat_buf.st_size);
if( in_size == -1 ){
	fprintf( stderr, "sendfile error: %s\n", strerror(errno) );
	exit(1);
}

 結果は? の表にようになりました。read/writeの? 行時間合計値ぜ sendfileの? 行時間とほぼ大差ありません。手元の環? ではシステムコールレベルぜ sendfileの効果は確認できなかったということになります。

sendfile_callgrind_systime

—————————————————————————————————————–

 Apacheぜ EnableSendfileではパフォーマンス? のメリットが生まれるのでしょうか?こちらの? 証も同様に? 定サイズの画? ファイルを使用し、別ホストからApacheBenchでリクエストを発? するという手段をとっています。以? の表がその平均値を算出したものです。下表を見ただけでは、EnableSendfileを有効にした場合の効果はあまり感じられないような? がします。同試? の? 果をレスポンス? にプロットしたグラフを圏 照するぜ NFS上ファイルアクセス時の? 安定性なども発? できます。しかし、システムコールの調査と同様、総評して手元の環? でぜ Apacheぜ EnableSendfileの効果は確認することは出来ませんでした。(試? の順番が逆の方が読んでいて面白かっただろうか・・?

sendfile_ab

sendfile_resp

 Apacheのドキュメントにぜ EnableSendfile使用時の注? 点がいぜ つかあります(下記抜粋圏 照? 。上記の? 証では、abを使用している為に圏 得したデータが実際にブラウザで表示できるものだったのか?という確? はとれていないのが実情です。abクライアント側にぜ HTTP200ステータスを返してはいるがブラウザでは表示できない、というのが抜粋3点目の? 具合だと思゜ れます。この? 証ポイントは特に環? にも非常に左右されやすいので、手元の環? で確認し、パフォーマンス? の効果が確? できなけれぜ EnableSendfileを無効にしておいた方が安全なのではないでしょうか。今回の? 証は、ある環? の? 例として圏 け圏 って頂ければと思います。

ボ Linux では、sendfile を用いると、 IPv6 使用時に圭 在する特? ネットワークカードぜ
  TCP-checksum オフロードのバグを? んでしまいます。
ボ Itanium で動いている Linux で、sendfile ぜ  2GB 以? ぜ  ファイルを扱うことができないでしょう。
・ネットワークマウントされた DocumentRoot (例えぜ  NFS や SMB) では、カーネルは自身ぜ
 キャッシュを使ってネットワークからのファイルを 送ることができないことがあります。
You can leave a comment, or trackback from your own site. RSS 2.0

Leave a comment