ablog

不器用で落着きのない技術者のメモ

なぜランダムアクセスを「db file sequential read」、シーケンシャルアクセスを「db file scattered read」というのか?

最前線UNIXのカーネル を読んでいて「scatter-gather I/O」という言葉を目にした。この「scatter」は Oracle Database の「db file scattered read」の「scattered」と同じ意味で使われているのではないかと思った。
Linuxシステムプログラミング P.88 にはファイル(データストリーム)からメモリ上の連続した領域(1つのバッファ)に読み込むのがリニアI/O、メモリ上の不連続な領域(複数のバッファ)に読込むのが scatter-gather I/O と書かれている。ちょうど、リニアI/Oが「db file sequential read」、scatter-gather I/O が「db file scattered read」に対応するのではないかと思った。
Oracle Database では I/O の最小単位はデータブロックだが、1つのデータブロックを読込んでメモリ上の連続した領域(1つのバッファ)におくのが「db file sequential read」、複数のデータブロックを読込んでメモリ上の不連続な領域(複数のバッファ)におくのが「db file sacttered read」と考えるとしっくりくる。
「こういう由来で命名されたに違いない!」と思って喜んでたら、絵で見てわかるOracleの仕組み (DB Magazine SELECTION) P.12 のコラム『「シーケンシャル」とはどんな意味?』にメモリ上で連続するから「db file sequential read」、メモリ上で分散するから「db file sacttered read」と書かれていました。昔読んだときはメモリのアーキテクチャとか全然知らなかったので、頭に入ってこなかったんだなぁと思いました。書籍は読み手の実力によって、読み取れることが異なる データベースコンサルタントのノウハウちょい見せ に「書き手が伝えようとしていることの10%程度を読み取れれば良い方だと思います」と書かれていますが、本当にそうだなと思いました。
製品マニュアル(パフォーマンス・ビューを使用したインスタンスのチューニング)にもしっかり書かれていますね。

シーケンシャルアクセスを db file scattered read、ランダムアクセスを db file sequential read と呼ぶのは Oracle Database を開発した開発者が実装側の視点から命名したのではないかと思います。Oracle Database は OS 上で動くアプリケーションにすぎないと考え、システムプログラミングについての知識をつけていくとこの呼び方に違和感がなくなってくるのではないかと思いました。

参考

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

P.12

Column 「シーケンシャル」とはどんな意味?
(中略)
「db file scattered read」は、シーケンシャル読込みですから、複数ブロックを読込みます。Oracleはブロック単位でデータをメモリ上に配置します。複数のブロックは連続しない(分散した)箇所に置かれます。そのため、"scattered"と表示されます。それに対して「db file sequential read」は、単一ブロック読み込みなので、読み込んだデータ(1ブロック)は当然メモリ上で連続します。Oracleのメモリ上、連続しているので"sequential"と表示されています。

db file scattered read待機イベントは、全体スキャンが発生していることを識別します。バッファ・キャッシュへの全体スキャンを実行すると、読み取られたブロックは物理的に相互に接近していないメモリー位置に読み取られます。このような読取りが散布読取りコールと呼ばれるのは、ブロックがメモリー全体に分散されているからです。

パフォーマンス・ビューを使用したインスタンスのチューニング


最前線UNIXのカーネル

最前線UNIXのカーネル

P. 262

8.2.5 scatter gather I/O
read と write システム・コールはファイルの論理的に連続した部分とプロセス・アドレス空間の連続した領域との間で大量のデータを転送する。
(中略)
UNIX ではファイルからユーザ空間の複数バッファにデータの移動を行う scatter-gatehr I/O を行うために、2つのシステム・コール(readv と writev)が追加されている。


Linuxシステムプログラミング

Linuxシステムプログラミング

P. 88

scatter-gather I/O
scatter-gather I/O とは、1データストリームへ複数のバッファを一度のシステムコールで書き込む、または逆に読み取るI/Oです。複数のバッファをばらまく(scattered into)、またはまとめる(gathered from)ため、scatter-gahter I/O(スキャッタ-ギャザI/O、ばらまき-まとめI/O)と言います。ベクタI/O(vectored I/O)という呼び方もあり、これに対し「2章 ファイルI/O」で解説した通常のI/OをリニアI/O(linear I/O)と言います。

If Oracle uses readv( ) the address array is traversed and the blocks read from disk are placed at the addresses therein. This operation is referred to as a UNIX managed scatter-read as the OS reads the blocks into the SGA. The Oracle kernel developers call this event a db file scattered read as it employs the read component of the longstanding UNIX scatter/gather I/O methodology.