ことはじめ
いやー、研究でね、1プロセスからマルチスレッドで、ストレージから多次元配列データのサブセットを並列読み出しをする必要があってね。 HDF5っていうライブラリは、全配列データを一つのファイルで管理する一方で、 TileDBは配列データを複数のファイルに分けて管理しているんですね。 で、ですよ。前にも説明した通り、HDF5を使ってPararell readをしようとすると、 なんと性能がスケールしないんですよね。で、HDF5の公式サイトを見ると、HDF5はマルチスレッドをサポートしていないって書いてあったんですよ。 ただね、「マルチスレッドをサポートしていない」っていうのは、OSとのやり取り、具体的には、ファイルシステムとか、スレッドとか、その辺でインタラクションが生じて、 「マルチスレッドをサポートできない」んだと思うんですよね。
というのもね、chatGPTに聞いた話によると、
POSIX I/O operations,
by default, do not provide built-in support for parallel reading of a single file from multiple threads.
When multiple threads attempt to read from a single file concurrently using POSIX I/O functions,
there is a potential for race conditions and data corruption because POSIX I/O operations do not provide automatic synchronization between threads for file access.
ってことなんですよね。でね、システムがどのファイルシステムを使っていたかっていうとね、ext4なんですよね。でね、ext4はPOSIX互換なんですよね。 つまり、どうやら、HDF5がマルチスレッドをサポートしていないのではなく、 ext4が単一ファイルの並列読み書きをサポートしていない可能性が高くなってきた。 まだ確証は得られていないのですが。ということで、今からファクトチェックをしていきたいと思っています。
[このブログのプロっぽい人が書いているのですが] (https://kevinclosson.net/2012/03/06/yes-file-systems-still-need-to-support-concurrent-writes-yet-another-look-at-xfs-versus-ext4/) 見てください。
EXT4 does not support concurrent writes, XFS does.
と主張しています。concurrentっていのは、並列、ではなく並行、ね。
いや、難しすぎる。まじで、
[この議論も観てほしい] (https://stackoverflow.com/questions/4543311/what-is-single-or-multi-thread-concept-in-area-of-file-system)
5
As known, the gingerbread is going to adopt ext4 to replace the YAFFS. The reason seems to be that YAFFS is single-threaded. Will someone explain what does "single-threaded" mean in the area of file system? So ext4 is multi-threaded? From what aspect?
thanks.
に対して、
Merlyn's comment was the right one. Per that document:
YAFFS is locked on a per-partition basis at a high level. This is simpler than tracking lower-level locking. Yaffs Direct Interface uses a single lock for all partitions.
IOW, only one thread can write to the whole partition at once.
Most Linux filesystems, like ext4, allow multiple threads to write at once (though file-level locks may serialize access to individual files).
つまり、gingerbreadっていう会社があって、めっちゃ古いYAFFSっていうファイルシステムを使っていたんだけど、なんとyaffsっていうのは、 only one thread can write to the whole partition at once、っていうことで、 これが雑魚過ぎて、ext4に移したんだね。で、Most Linux filesystems, like ext4, allow multiple threads to write at onceってことなので、マルチスレッドによる 書き出しはサポートしていますよーと。しかし、そのあとが重要そうですね。 though file-level locks may serialize access to individual files.
ということなので、やはりext4つまり、posix互換のファイルシステムを使うと、 単一ファイルへの並列アクセスがシリアライズされるようですね。 アクセス=読み書きであれば、アクセスがシリアライズされる、ということは、4並列での読み出しが、OSから見ると1並列での読み出しと同じになってしまうということですね。悲しいですね。。。 しかし、確かに書き込みはシリアライズしないと整合性が取れないけど、読み出しは別にシリアライズしなくてもいいのではないか?とも思っているのですがね。 やっぱりわからない。
結論
HDF5は単一のファイルで全部のデータを保存する。 ファイルシステムにposix互換であるext4を使うと、posix互換のファイルシステムは 単一ファイルへのアクセスをシリアライズするので、ストレージのバンド幅を使い切るのは 無理というお話でございました。 TileDBは各データを別々のファイルに保存することで、posix互換のファイルシステム上でも並列読み出しをしているように見えるだけです!
だいぶ怪しいですがね。自信はないです。