Filesystem性能比較 3
各種ファイルシステムにおける巨大ファイル作成速度を比較
概要
BtrFS, Ext2, Ext4, JFS, XFSにおける巨大ファイル(16GB, 32GB)の作成時間を測定しました.
XFSが速いです.
環境
ファイルシステム 簡易紹介
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
結果
XFSが高性能です.
エラーバーは95IC.
95CIの求め方に興味がある方はこちらを読んでみてください.
BtrFSは1回目のみ速い.
Ext2/4は性能のばらつきが大きい
やはりXFSが速いが,BtrFSも速い.Ext4は大して速くない.
BtrFSは1回目だけ速い.XFSは速い場合と遅い場合がある.
結果のファイル
実験2
プログラム
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回だと高い性能が得られます.