事始め

研究で開発しているミドルウェアがストレージからの読み出しをするんだよね。しかもparalellに。でもね、なんか知らないけど、paralellの数が3になるとめちゃめちゃ遅延が発生するようになってしまったんだよね。これなんでやと。気になったわけですよね。で、いろいろ調べようと思ったんです。

復習だけど、ファイルシステムとは

物理ストレージにビットを書き込むわけです、保存するためには。ただね、これ、どこにどういう風に書き込むか、というのはすごく面倒くさいんですよね、プログラムから管理するのは。だから、保存操作を抽象化してくれるソフトを作ったわけです。 ファイルシステムというね。ファイルシステムはOSにもともと組み込まれているもので、Linux-kernelを見ると確かにfsっていうディレクトリがある。 で、ファイルシステムはLinux-kernel越しに使うので、I/Oはシステムコールになるって話ですね。はい。

ストレージのパーティションに構築されたファイルシステムの種類を確認

df -Th

このコマンドで確認できます。

ストレージへの読み書き速度ベンチマーク

ddコマンド

The dd command is a simple way to test sequential read performance. You can use it to read a large file in parallel from multiple processes. Here's an example:

ってのでもらったexample scriptがこちら

# Create a large test file (if it doesn't already exist)
dd if=/dev/zero of=testfile bs=1M count=1000

# Use multiple dd processes to read the file in parallel
for i in {1..4}; do
    dd if=testfile of=/dev/null bs=1M iflag=direct status=none &
done

# Wait for all dd processes to finish
wait

fioコマンド

こっちの方が使いやすいと思う、のでこっちを使うことに使用

fio (Flexible I/O Tester) is a more advanced tool for benchmarking storage performance. You can create a configuration file for fio that specifies the workload and parallelism you want to test. Here's a basic example:

まずはインストールしないといけませんね

# Install fio if not already installed
sudo apt-get install fio   # For Ubuntu/Debian
# or
sudo yum install fio       # For CentOS/RHEL

# Create an fio configuration file (e.g., read_benchmark.fio)
nano read_benchmark.fio

次にベンチマークの設定ファイルを書かないといけませんね。

[read_test]
filename=/path/to/your/testfile
rw=read
bs=4k
size=1G
numjobs=4
direct=1

そのあとにこちらのコマンドで実行します。

fio read_benchmark.fio

fioコマンドで実際に実験してみた!

スクリプト (read_parallel_bench.fio)

[read_test]
filename=/scratch/readbench/test
rw=read
bs=4k
size=1G
numjobs=4
direct=1

てかんじでどうだろう! ちなみにこれはsequential accessだね。うん。で、やっぱりnumjobsを増やすと 各プロセスあたりのスループットは減少する感じだったね。

ランダムアクセスのスクリプト (read_paralell_bench_random.fio)

[read_test]
filename=/scratch/readbench/test
rw=randread
bs=4k
size=1G
numjobs=4
direct=1
rwmixread=100
randrepeat=0

ベンチマーク結果から分かったこと

bsが小さくなるとスループットがだいぶ小さくなる。 つまり、いかにシーケンシャルに読み出せるかが大事

1/5追記:ミドルウェアでストレージからの読み出しが非常に遅かった理由

あのね、ストレージからの読み出しにHDF5を使っていたのだよね。 しかしね、HDF5はなんとマルチスレッドをサポートしていなかったんだよね。 これ、くそすぎるんだよね。てか、マルチスレッドをサポートしていないってどういううことなんだ??意味が分からない。どうやったらマルチスレッドをサポートしていないライブラリを作れるのか?逆にすごいと思う。 つまりね、マルチスレッドをサポートしていないのにマルチスレッドで読みだそうとすると、 例えば3つのスレッドがそれぞれ、aaaa,bbbb,ccccっていう読み出しをしたいとき、 それぞれの読み出しがシリアライズされて、 abcabcabcabcってなるんだよね。さすがにひどすぎるだろうと。まあ、昔はマルチプロセスが一般的だったからその名残だとは思っているのだが。