見出し画像

Filesystem性能比較 3

各種ファイルシステムにおける巨大ファイル作成速度を比較

概要

BtrFS, Ext2, Ext4, JFS, XFSにおける巨大ファイル(16GB, 32GB)の作成時間を測定しました.
XFSが速いです.

環境

CPU: Intel Core i7-3770 CPU @ 3.40GHz
HDD: Seagate Barracuda 7200.9, ST3808110AS (80.0GB)
OS: Ubuntu 20.04.3 LTS, desktop, Linux 5.15.25
Memory: 16 GB
/dev/sdb全体をformat (ex. mkfe.ext2 /dev/sdb)

ファイルシステム 簡易紹介

Ext2は初期のLinuxから使用されてきたFSで,先進的ではないです.
Ext4は,エクステントという仕組みを持っておりExt2/3より大きなファイルを効率的に扱えます.
XFSはIRIX用のFSで大きなファイルが得意と言われています.

実験1

CPU clock rate 3.4 GHz固定.
ファイルサイズ 16 GB と 32 GB で測定.
各測定10回

プログラム (16GB)

#define BLK (1024*1024)
#define NBLK (16*1024)
#define NTIME 4
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/stat.h>

char fname[] = "/mnt/a";
char buf[BLK];
void main(){
	int fd, i;
        struct timespec ts[NTIME];
	fd = open( fname, O_CREAT | O_WRONLY);
	if( fd == -1 ){
		perror("?");
		exit(1);
	}
	clock_gettime(CLOCK_REALTIME, ts);
	for(i=0; i<NBLK; i++){
		write( fd, buf, BLK);
	}
	clock_gettime(CLOCK_REALTIME, ts+1);
	close(fd);
	clock_gettime(CLOCK_REALTIME, ts+2);
	unlink( fname);
	clock_gettime(CLOCK_REALTIME, ts+3);
	for(i=0; i<NTIME; i++){
		printf("%ld.%09ld ",ts[i].tv_sec,ts[i].tv_nsec);
	}
	printf("\n");
}

プログラム (32GB)

#define BLK (1024*1024)
#define NBLK (32*1024)
#define NTIME 4
(以下同様)

おまけ (連続実験 shell script)

for fs in btrfs ext2 ext4 jfs xfs
do
	echo ${fs}
	if [ ${fs} = "xfs" -o ${fs} = "btrfs" ]
	then
		mkfs.${fs} -f /dev/sdb
	else
		echo y | mkfs.${fs} /dev/sdb
	fi
	mount /dev/sdb /mnt/
	mount | grep sdb > result.${fs}.txt
	echo 3 > /proc/sys/vm/drop_caches
	for i in `seq 0 9`
	do
		echo ${fs}.${i} ; date
		./a.out >> result.${fs}.txt 
	done
	sync
	umount /mnt/
done

おまけ (集計 shell script)

grep ^[1-9] result.*txt | sed "s/:/ /" | awk '{print $1,$3-$2,$5-$4}' > all.txt

結果

平均16GBファイル作成時間

XFSが高性能です.
エラーバーは95IC. 
95CIの求め方に興味がある方はこちらを読んでみてください.

16GBファイル作成時間 (1回目~10回目)

BtrFSは1回目のみ速い.
Ext2/4は性能のばらつきが大きい

平均32GBファイル作成時間

やはりXFSが速いが,BtrFSも速い.Ext4は大して速くない.

32GBファイル作成時間 (1回目~10回目)

BtrFSは1回目だけ速い.XFSは速い場合と遅い場合がある.

結果のファイル

実験2

CPU clock rate 1.6 GHz固定.
ファイルサイズ 16 GB と 32 GB で測定.
各測定1回のみ

プログラム

16GBのファイルを作るプログラム

#define BLK (1024*1024)
#define NBLK (16*1024)
#define NTIME 4
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/stat.h>

char fname[] = "/mnt/a";
char buf[BLK];
void main(){
        int fd, i;
        struct timespec ts[NTIME];
        fd = open( fname, O_CREAT | O_WRONLY);
        if( fd == -1 ){
                perror("?");
                exit(1);
        }
        clock_gettime(CLOCK_REALTIME, ts);
        for(i=0; i<NBLK; i++){
                write( fd, buf, BLK);
        }
        clock_gettime(CLOCK_REALTIME, ts+1);
        close(fd);
        clock_gettime(CLOCK_REALTIME, ts+2);
        unlink( fname);
        clock_gettime(CLOCK_REALTIME, ts+3);
        for(i=0; i<NTIME; i++){
                printf("%ld.%09ld ",ts[i].tv_sec,ts[i].tv_nsec);
        }
        printf("\n");
}

32GBのファイルを作るプログラム

#define BLK (1024*1024)
#define NBLK (32*1024)
#define NTIME 4
以下、同様

おまけファイル (実験実行)

for fs in btrfs ext2 ext4 jfs xfs
do
	echo ${fs}
	if [ ${fs} = "xfs" -o ${fs} = "btrfs" ]
	then
		mkfs.${fs} -f /dev/sdb
	else
		echo y | mkfs.${fs} /dev/sdb
	fi
	mount /dev/sdb /mnt/
	mount | grep sdb > result.${fs}.txt
	./a.out >> result.${fs}.txt 
	umount /mnt/
done

おまけファイル (結果集計)

grep ^[1-9] result.*txt | sed "s/:/ /" | awk '{print $1,$3-$2,$5-$4}' > all.txt

結果

XFSが速いです.
BtrFSは1回目のみ速いので,計測回数が1回だと高い性能が得られます.

この記事が気に入ったらサポートをしてみませんか?