連載
» 2012年09月07日 00時00分 公開

システムコールの特性を知る pipe(2)編知ってトクするシステムコール(8)(2/2 ページ)

[後藤大地,GLOBIS.JP]
前のページへ 1|2       

pipe(2)読み書き性能の分岐点は64KB、128KB、4MB

 ベンチマークの結果をまとめると次のようになる。だいたい64KBまたは128KBで性能がピークに達する。4MBでもスポット的によい性能が出ている。そして、それ以上読み書きのサイズを増やしても性能は劣化する傾向が現れている。

実装方法 real[s] user[s] sys[s]
1KB 26.42 3.26 17.27
4KB 8.60 1.00 5.41
16KB 5.04 0.42 2.02
64KB 2.40 0.11 0.73
128KB 2.39 0.06 0.71
256KB 2.46 0.05 0.68
512KB 2.53 0.00 0.71
1MB 2.52 0.00 0.71
2MB 2.42 0.03 0.63
4MB 2.24 0.03 0.58
8MB 2.61 0.04 0.64
16MB 2.94 0.08 0.66
32MB 2.90 0.18 0.62
64MB 3.09 0.30 0.63
128MB 3.38 0.49 0.73
256MB 3.83 0.99 0.70
表1 バッファサイズごとに見た読み書き処理の所要時間

実装方法 強制的コンテキストスイッチ回数 自発的コンテキストスイッチ回数
1KB 555 7200100
4KB 95 2337327
16KB 71 655394
64KB 5 163852
128KB 2 163851
256KB 31 163854
512KB 1 163843
1MB 11 163856
2MB 24 163842
4MB 7 163843
8MB 6 163846
16MB 12 163842
32MB 6 163844
64MB 9 163845
128MB 12 163842
256MB 21 163851
表2 強制的/自発的コンテキストスイッチの回数
図1 バッファサイズごとに見た読み書き処理の所要時間
図2 強制的コンテキストスイッチの回数
図3 自発的コンテキストスイッチの回数

 システムコールの呼び出し回数には、それほど大きな違いは見られない。

 読み書きの単位が64KB以下だと性能が劣化していることが分かる。自発的なコンテキストスイッチの回数が64KB以上になるとほとんど変化がなくなるのは、write(2)でどれだけ一気に書きこんでも、read(2)で読み込まれるサイズの上限が64KBに制限されているためだ。

 FreeBSD 10-CURRENTで実験した限りでは、最大限に性能を発揮させたいなら4MBごとの書き込み、無難に常に性能が出ればよいならパイプのバッファ上限である64KB単位での書き込みに整理しておけばよい、ということになる。

特性を知ることで性能を発揮させる

 このようにベンチマークを取ることで、同じシステムコールであっても性能に大きな違いが表れることを確認できる。

 今回は、最初からパイプで使われているバッファ戦略を理解した上でベンチマークを作成しているため、予想通りの値が出ているが、これは中身を知らなくても愚直にベンチマークを作成していっても分かることだ。

 この手のベンチマークを実施する場合、「ページサイズ4KB」というのを1つの指針と考え、ここから値を増やしたり減らしたりしながら性能がどのように変化するかを調べるとよい。使い方1つで大きく性能が変わってくる。

著者プロフィール

後藤大地

BSDコンサルティング株式会社取締役。オングス代表取締役。@ITへの寄稿、MYCOMジャーナルにおけるニュース執筆のほか、アプリケーション開発やシステム構築、『改訂第二版 FreeBSDビギナーズバイブル』『D言語パーフェクトガイド』『UNIX本格マスター 基礎編〜Linux&FreeBSDを使いこなすための第一歩〜』など著書多数。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。