システムコールの特性を知る pipe(2)編:知ってトクするシステムコール(8)(2/2 ページ)
これまで数回にわたって紹介してきたmmap(2)に続き、今度はpipe(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 強制的/自発的コンテキストスイッチの回数 |
システムコールの呼び出し回数には、それほど大きな違いは見られない。
読み書きの単位が64KB以下だと性能が劣化していることが分かる。自発的なコンテキストスイッチの回数が64KB以上になるとほとんど変化がなくなるのは、write(2)でどれだけ一気に書きこんでも、read(2)で読み込まれるサイズの上限が64KBに制限されているためだ。
FreeBSD 10-CURRENTで実験した限りでは、最大限に性能を発揮させたいなら4MBごとの書き込み、無難に常に性能が出ればよいならパイプのバッファ上限である64KB単位での書き込みに整理しておけばよい、ということになる。
特性を知ることで性能を発揮させる
このようにベンチマークを取ることで、同じシステムコールであっても性能に大きな違いが表れることを確認できる。
今回は、最初からパイプで使われているバッファ戦略を理解した上でベンチマークを作成しているため、予想通りの値が出ているが、これは中身を知らなくても愚直にベンチマークを作成していっても分かることだ。
この手のベンチマークを実施する場合、「ページサイズ4KB」というのを1つの指針と考え、ここから値を増やしたり減らしたりしながら性能がどのように変化するかを調べるとよい。使い方1つで大きく性能が変わってくる。
著者プロフィール
後藤大地
BSDコンサルティング株式会社取締役。オングス代表取締役。@ITへの寄稿、MYCOMジャーナルにおけるニュース執筆のほか、アプリケーション開発やシステム構築、『改訂第二版 FreeBSDビギナーズバイブル』『D言語パーフェクトガイド』『UNIX本格マスター 基礎編〜Linux&FreeBSDを使いこなすための第一歩〜』など著書多数。
Copyright © ITmedia, Inc. All Rights Reserved.