日記/2011-12-03/splice システムコール
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
] [
リンク元
]
開始行:
* splice システムコール [#o5c0f2aa]
linux 上の splice システムコールについては,前から気にな...
で,重い腰を上げて色々突ついてみた,というおはなし.
** splice システムコールとは [#e6855d88]
指定した 2 つのファイルディスクリプタを(カーネル側で)接...
詳しくは [http://linuxjm.sourceforge.jp/html/LDP_man-page...
** read/write の場合 [#hda7f9cb]
例えば,ファイルのコピーをする場合,普通に考えると
+ 読み出し側ファイルを open
+ 書き込み側ファイルを open
+ 以下繰り返し
++ 読み出し側ファイルからデータを読み出し
++ 書き込み側ファイルにデータを書き込む
のようなプログラムになる.
この場合,カーネル空間からユーザ空間のバッファにいったん...
^
カーネル空間 | |
--------------------fd1----fd2-------------------------
ユーザ空間 | |
V |
バッファ
** splice を使うと [#r32bb88f]
splice を使った場合のファイルコピーは
+ 読み出し側ファイルを open
+ 書き込み側ファイルを open
+ パイプを用意する
+ 以下繰り返し
++ 読み出し側ファイルからパイプへのデータ転送を splice で...
++ パイプから書き込み側ファイルへのデータ転送を splice で...
となる.
読み出し側ファイルと書き込み側ファイル間のデータ転送を直...
概念どおりに考えれば,やっぱりデータコピーが発生すること...
カーネル空間 fd1 -> ==(パイプ)== -> fd2
---------------------^---------------^---------------
ユーザ空間 | |
splice! splice!
** パイプ詰まり? [#ld4302d1]
パイプを使ったプログラムを書いた経験のある人ならわかると...
つまり,パイプの読み出し側でデータを読み出してない状態で...
水道管の出口がふさがったまま水を流しつづけると,入り口側...
というわけで,最初はスレッドを使ってパイプの入り口と出口...
が,[http://d.hatena.ne.jp/viver/20071011/p1 ここ]を見る...
これだと「パイプ詰まりと詰まり解消が交互に起きることにな...
が,こういう実例もあるからには,splice を使ったときのパイ...
** ベンチマーク [#v3ef951a]
#ref(test_splice.c)
というわけで,適当にベンチマークプログラムを作成.
見ているのは
+ read,write を繰り替えした転送
+ splice を単一スレッドで交互に呼び出した場合
+ splice を複数スレッドで同時に呼び出した場合
で,
- /dev/zero から /dev/null への転送
- 転送量は 16 GiB
- read, write でのバッファサイズは 16 MiB
という条件で実行してみた.
$ ./a.out /dev/zero /dev/null
read_write 計測開始
user = 0.000000, system = 8.412525
splice nothread 版計測開始
user = 0.044002, system = 4.056254
splice thread 版計測開始
user = 0.052004, system = 3.912244
転送速度を計算すると
||転送速度|h
|read/write|2.0 GB/s|
|splice 単一スレッド|4.3 GB/s|
|splice 複数スレッド|4.4 GB/s|
という結果になった.
splice を使うと read, write に比べて 2 倍以上の転送速度が...
で,交互に splice を呼び出す場合と複数スレッドで同時に呼...
少しは速いんだけれど,スレッドプログラミングの手間に見合...
ところで,現在の普通の HDD でのデータファイルの転送速度は...
で,read / write での実装でもこれよりも 1 桁上の転送速度...
つまり,HDD への読み書きに関して言えば,read/write から s...
** splice ごとの転送バイト数 [#lc43bdd3]
で,今度は splice の呼び出しの後に転送バイト数を出力する...
パイプの挙動を見るためである.
その結果…
> 単一スレッドで交互に呼び出しても,複数スレッドで同時に...
だった.
> パイプと言っても中身は単なるバッファだし,「スムースに...
という,考えてみれば当たり前の結論に達する.
** まとめ [#fdc3581e]
- splice を使うと,ファイルディスクリプタ間のデータ転送速...
- が,ファイルアクセス自体の速度が遅ければ,ほとんど効果...
- 単一スレッドでの交互呼び出しと複数スレッドでの同時呼び...
** 参考 [#ob518546]
:JM project の日本語訳 man ページ|
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/spl...
:splice()とvmsplice()を試す|
http://d.hatena.ne.jp/viver/20071011/p1
終了行:
* splice システムコール [#o5c0f2aa]
linux 上の splice システムコールについては,前から気にな...
で,重い腰を上げて色々突ついてみた,というおはなし.
** splice システムコールとは [#e6855d88]
指定した 2 つのファイルディスクリプタを(カーネル側で)接...
詳しくは [http://linuxjm.sourceforge.jp/html/LDP_man-page...
** read/write の場合 [#hda7f9cb]
例えば,ファイルのコピーをする場合,普通に考えると
+ 読み出し側ファイルを open
+ 書き込み側ファイルを open
+ 以下繰り返し
++ 読み出し側ファイルからデータを読み出し
++ 書き込み側ファイルにデータを書き込む
のようなプログラムになる.
この場合,カーネル空間からユーザ空間のバッファにいったん...
^
カーネル空間 | |
--------------------fd1----fd2-------------------------
ユーザ空間 | |
V |
バッファ
** splice を使うと [#r32bb88f]
splice を使った場合のファイルコピーは
+ 読み出し側ファイルを open
+ 書き込み側ファイルを open
+ パイプを用意する
+ 以下繰り返し
++ 読み出し側ファイルからパイプへのデータ転送を splice で...
++ パイプから書き込み側ファイルへのデータ転送を splice で...
となる.
読み出し側ファイルと書き込み側ファイル間のデータ転送を直...
概念どおりに考えれば,やっぱりデータコピーが発生すること...
カーネル空間 fd1 -> ==(パイプ)== -> fd2
---------------------^---------------^---------------
ユーザ空間 | |
splice! splice!
** パイプ詰まり? [#ld4302d1]
パイプを使ったプログラムを書いた経験のある人ならわかると...
つまり,パイプの読み出し側でデータを読み出してない状態で...
水道管の出口がふさがったまま水を流しつづけると,入り口側...
というわけで,最初はスレッドを使ってパイプの入り口と出口...
が,[http://d.hatena.ne.jp/viver/20071011/p1 ここ]を見る...
これだと「パイプ詰まりと詰まり解消が交互に起きることにな...
が,こういう実例もあるからには,splice を使ったときのパイ...
** ベンチマーク [#v3ef951a]
#ref(test_splice.c)
というわけで,適当にベンチマークプログラムを作成.
見ているのは
+ read,write を繰り替えした転送
+ splice を単一スレッドで交互に呼び出した場合
+ splice を複数スレッドで同時に呼び出した場合
で,
- /dev/zero から /dev/null への転送
- 転送量は 16 GiB
- read, write でのバッファサイズは 16 MiB
という条件で実行してみた.
$ ./a.out /dev/zero /dev/null
read_write 計測開始
user = 0.000000, system = 8.412525
splice nothread 版計測開始
user = 0.044002, system = 4.056254
splice thread 版計測開始
user = 0.052004, system = 3.912244
転送速度を計算すると
||転送速度|h
|read/write|2.0 GB/s|
|splice 単一スレッド|4.3 GB/s|
|splice 複数スレッド|4.4 GB/s|
という結果になった.
splice を使うと read, write に比べて 2 倍以上の転送速度が...
で,交互に splice を呼び出す場合と複数スレッドで同時に呼...
少しは速いんだけれど,スレッドプログラミングの手間に見合...
ところで,現在の普通の HDD でのデータファイルの転送速度は...
で,read / write での実装でもこれよりも 1 桁上の転送速度...
つまり,HDD への読み書きに関して言えば,read/write から s...
** splice ごとの転送バイト数 [#lc43bdd3]
で,今度は splice の呼び出しの後に転送バイト数を出力する...
パイプの挙動を見るためである.
その結果…
> 単一スレッドで交互に呼び出しても,複数スレッドで同時に...
だった.
> パイプと言っても中身は単なるバッファだし,「スムースに...
という,考えてみれば当たり前の結論に達する.
** まとめ [#fdc3581e]
- splice を使うと,ファイルディスクリプタ間のデータ転送速...
- が,ファイルアクセス自体の速度が遅ければ,ほとんど効果...
- 単一スレッドでの交互呼び出しと複数スレッドでの同時呼び...
** 参考 [#ob518546]
:JM project の日本語訳 man ページ|
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/spl...
:splice()とvmsplice()を試す|
http://d.hatena.ne.jp/viver/20071011/p1
ページ名:
-->