はじめに
空のファイルを作る時、どのようなコマンドを使っているでしょうか?
私の場合は以下のように、ファイルサイズが0であればtouch
コマンド、一定のサイズのファイルが必要な場合はdd
コマンドを使っていました。
ところがdd
コマンドとは別に、一定のサイズのファイルを作る方法としてfallocate
というコマンドがあることを知ったので、両者のパフォーマンスを比較してみました。
[nkojima@akagi sample_files]$ touch sample.txt
[nkojima@akagi sample_files]$ dd if=/dev/zero of=./sample2.txt bs=1K count=1024
1024+0 レコード入力
1024+0 レコード出力
1048576 バイト (1.0 MB) コピーされました、 0.00580267 秒、 181 MB/秒
[nkojima@akagi sample_files]$ ls -lah
合計 1.0M
drwxrwxr-x 2 nkojima nkojima 43 6月 21 12:18 .
drwx------. 5 nkojima nkojima 175 6月 21 12:17 ..
-rw-rw-r-- 1 nkojima nkojima 0 6月 21 12:17 sample.txt
-rw-rw-r-- 1 nkojima nkojima 1.0M 6月 21 12:18 sample2.txt
テストに使用した環境
- CPU
- Kabylake: Pentium G4560
- マザーボード:ASRock H110M-STX
- メモリ:8GB(4GB×2枚)
- ストレージ:256GB SSD(NVMe)
- OS
- CentOS 7.8(2003)
テスト方法
-
dd
コマンドとfallocate
コマンドを使って、様々なサイズのファイルを作成して、その処理速度を測定しました。 - ファイルサイズ:100MB、500MB、1GB、2GB、4GB、8GB、16GB
-
dd
コマンドのオプションのブロックサイズ(-bs)は1MBとしました。 - 処理時間の測定には、以下のように
date
コマンドを使ったため、正確な処理時間でありません。 - 処理を3回実行して、その平均値をテスト結果としました。
[root@akagi ~]# date; dd if=/dev/zero of=dd.txt bs=1M count=100; date;
2020年 6月 21日 日曜日 12:48:28 JST
100+0 レコード入力
100+0 レコード出力
104857600 バイト (105 MB) コピーされました、 0.0362178 秒、 2.9 GB/秒
2020年 6月 21日 日曜日 12:48:29 JST
[root@akagi ~]# date; fallocate -l 100m ./fallocate.txt; date;
2020年 6月 21日 日曜日 12:48:52 JST
2020年 6月 21日 日曜日 12:48:52 JST
テスト結果
- 以下の表を見れば一目瞭然、圧倒的に
fallocate
コマンドの方が高速でした。 - swap領域を作る時など、単一の大きなファイルを作る必要があるケースでは、特にfallocateコマンドが有用だと考えられます。
-
dd
コマンドは高速なストレージ(NVMe-SSD)を使ってもそれなりに処理時間がかかるので、低速なストレージだとさらに大きな差がつくのではないかと思います。
ファイルサイズ | ddコマンドの処理時間(秒) | fallocateコマンドの処理時間(秒) |
---|---|---|
100MB | <1 | <1 |
500MB | <1 | <1 |
1GB | 1 | <1 |
2GB | 2 | <1 |
4GB | 4 | <1 |
8GB | 7 | <1 |
16GB | 15 | <1 |
関連記事
- 指定したサイズと数量でテスト用ファイルを生成
- こちらの記事も、
dd
コマンドからfallocate
コマンドを利用する形に修正したほうが良さそうです。