Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Linux

Сравнение производительности файловых систем EXT4, XFS, BTRFS

27.11.2020 15:05


08.11.2020 21:27
OlegON
 
Итак, на носу конец 2020 года и ядро 5.8.18-300.fc33.x86_64
После многочисленных убеждений, что BTRFS теперь не хуже всех остальных файловых систем, я решил обновить свои тесты на HDD. Обращаю внимание, что большинство тестов я повторял минимум по три раза, чтобы понимать, что на цифры не повлияли какие-то внешние факторы.

/mnt/ext4 ext4 noatime,nofail 0 2
/mnt/xfs xfs noatime,nofail 0 2
/mnt/btrfs btrfs noatime,nofail 0 0
/mnt/btrfsz btrfs noatime,nofail,compress=zstd:1 0 0

Запись 500000 мелких файликов

Код:
#!/bin/bash
sync; echo 3 > /proc/sys/vm/drop_caches
echo EXT4
time ./flood.sh ext4
sync; echo 3 > /proc/sys/vm/drop_caches
echo XFS
time ./flood.sh xfs
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFS
time ./flood.sh btrfs
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFSZ
time ./flood.sh btrfsz
Код:
#!/bin/bash
for i in {1..500000}
do
   echo "Welcome $i times" > /mnt/$1/test$i.txt
done
Первый прогон по пустому диску
EXT4
real 0m13,437s
user 0m4,416s
sys 0m8,614s

XFS
real 0m34,159s
user 0m4,994s
sys 0m12,123s

BTRFS
real 0m19,315s
user 0m4,665s
sys 0m10,693s

BTRFSZ
real 0m20,145s
user 0m4,648s
sys 0m10,439s

Второй прогон с перезаписью предыдущих файлов
EXT4
real 0m27,579s
user 0m5,735s
sys 0m19,927s

XFS
real 0m56,698s
user 0m6,470s
sys 0m24,165s

BTRFS
real 0m21,664s
user 0m5,185s
sys 0m13,223s

BTRFSZ
real 0m25,219s
user 0m5,301s
sys 0m13,636s

Третий прогон не отличался от второго, потому дальше тестировать счел бессмысленным... Налицо вырвавшаяся вперед BTRFS при перезаписи файлов. И неожиданное для меня проседание для XFS. Предложения и пожелания по тестам прошу ниже.
08.11.2020 22:37
OlegON
 
Подготовил аналогичный скрипт, где файлам делалось rm
Код:
#!/bin/bash
sync; echo 3 > /proc/sys/vm/drop_caches
echo EXT4
time ./flood2.sh ext4
sync; echo 3 > /proc/sys/vm/drop_caches
echo XFS
time ./flood2.sh xfs
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFS
time ./flood2.sh btrfs
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFSZ
time ./flood2.sh btrfsz
Код:
#!/bin/bash
for i in {1..500000}
do
   rm -f /mnt/$1/test$i.txt
done
Я знал, что будет плохо, но не думал, что настолько... Хотя, с учетом почти одинакового времени и очень большой загрузки процессора основным батником, могу предположить, что проблема в пересчете файлов, а не работе файловой системы.

EXT4
real 20m43,855s
user 1m12,554s
sys 19m29,165s

XFS
real 23m2,195s
user 1m21,776s
sys 21m33,589s

BTRFS
real 21m33,919s
user 1m15,191s
sys 20m10,055s
09.11.2020 10:16
OlegON
 
Однопоточное, большой файл, надо отметить, что после экспериментов с полумиллионом файлов я ext4 пересоздал, поскольку ее метаданные сильно раздуло и после удаления файлов они не изменились (как в NTFS косяк)

Код:
#!/bin/bash
sync; echo 3 > /proc/sys/vm/drop_caches
echo EXT4
time dd if=/dev/zero of=/mnt/ext4/test bs=1M count=29000
sync; echo 3 > /proc/sys/vm/drop_caches
echo XFS
time dd if=/dev/zero of=/mnt/xfs/test bs=1M count=29000
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFS
time dd if=/dev/zero of=/mnt/btrfs/test bs=1M count=29000
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFSZ
time dd if=/dev/zero of=/mnt/btrfsz/test bs=1M count=29000
Первый проход
EXT4
30408704000 байт (30 GB, 28 GiB) скопирован, 236,266 s, 129 MB/s
XFS
30408704000 байт (30 GB, 28 GiB) скопирован, 208,634 s, 146 MB/s
BTRFS
30408704000 байт (30 GB, 28 GiB) скопирован, 198,393 s, 153 MB/s
BTRFSZ
30408704000 байт (30 GB, 28 GiB) скопирован, 16,2438 s, 1,9 GB/s

удивительно, насколько ускоряет на хорошо сжимаемых данных компрессия файловой системы...
Посмотрим, сколько места осталось после этой операции...
Код:
btrfs       30G          29G  1,2G           97% /mnt/btrfs
btrfs       30G         999M   29G            4% /mnt/btrfsz
xfs         30G          29G  1,5G           96% /mnt/xfs
ext4        30G          29G     0          100% /mnt/ext4
и видим, что в ext4 вообще все занято (но не забываем про изменяемый лимит для рута)... если исключить очевидного победителя со сжатием, то xfs достаточно осторожна с ресурсами...

Второй прогон, с переписыванием поверху
EXT4
30408704000 байт (30 GB, 28 GiB) скопирован, 161,15 s, 189 MB/s
XFS
30408704000 байт (30 GB, 28 GiB) скопирован, 291,195 s, 104 MB/s
BTRFS
30408704000 байт (30 GB, 28 GiB) скопирован, 207,33 s, 147 MB/s
BTRFSZ
30408704000 байт (30 GB, 28 GiB) скопирован, 16,4484 s, 1,8 GB/s

И, для порядка, третий... тоже с переписыванием

EXT4
30408704000 байт (30 GB, 28 GiB) скопирован, 149,1 s, 204 MB/s
XFS
30408704000 байт (30 GB, 28 GiB) скопирован, 274,572 s, 111 MB/s
BTRFS
30408704000 байт (30 GB, 28 GiB) скопирован, 218,444 s, 139 MB/s
BTRFSZ
30408704000 байт (30 GB, 28 GiB) скопирован, 16,9459 s, 1,8 GB/s

Очевидно, что для данных со сжатием и линейной записью BTRFS просто разрывает по скорости, если включить компрессию, но достаточно скромна без нее. XFS удручает и в этом случае...
09.11.2020 13:23
OlegON
 
Удаление горы мелких файлов (сначала из первого скрипта сделал 1500000 файлов). Потом

Код:
#!/bin/bash
perl -e 'chdir "/mnt/'$1'/" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'
Код:
#!/bin/bash
./flood.sh ext4
sync; echo 3 > /proc/sys/vm/drop_caches
echo EXT4
time ./flood4.sh ext4
./flood.sh xfs
sync; echo 3 > /proc/sys/vm/drop_caches
echo XFS
time ./flood4.sh xfs
./flood.sh btrfs
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFS
time ./flood4.sh btrfs
./flood.sh btrfsz
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFSZ
time ./flood4.sh btrfsz
EXT4
real 0m35,475s
user 0m1,344s
sys 0m18,728s

XFS
real 1m5,575s
user 0m1,696s
sys 0m35,075s

BTRFS
real 0m43,779s
user 0m1,577s
sys 0m31,305s

BTRFSZ
real 2m18,420s
user 0m1,590s
sys 0m30,313s

видно, что с компрессией тут небольшая задница... Она ожидаемая на самом деле, особенно в свете небольшой величины файлов. XFS традиционно уже для этого теста в заднице, а вот с ext4 занятно... Хоть и быстро, но, как я уже говорил, не удаляются метаданные, смотрим, как это выглядит в ls -l

Код:
drwxr-xr-x. 1 root root        0 ноя  9 12:55 btrfs
drwxr-xr-x. 1 root root        0 ноя  9 13:02 btrfsz
drwxr-xr-x. 2 root root 52363264 ноя  9 12:48 ext4
drwxr-xr-x. 2 root root        6 ноя  9 12:51 xfs
11.11.2020 18:06
OlegON
 
Код:
#!/bin/bash
sync; echo 3 > /proc/sys/vm/drop_caches
rsync -a /usr /mnt/tmp/
echo EXT4
time rsync -a /usr /mnt/ext4/
echo XFS
time rsync -a /usr /mnt/xfs/
echo BTRFS
time rsync -a /usr /mnt/btrfs/
echo BTRFSZ
time rsync -a /usr /mnt/btrfsz/
EXT4
real 0m53,453s
user 0m20,165s
sys 0m16,407s

XFS
real 1m14,899s
user 0m19,764s
sys 0m17,666s

BTRFS
real 0m35,069s
user 0m20,206s
sys 0m17,344s

BTRFSZ
real 1m50,869s
user 0m20,352s
sys 0m18,049s

повторный прогон (когда rsync только читает) занимает 1-2 секунды на всех ФС, потому не интересен... Я все больше убеждаюсь, что XFS на устройства с маленькими IOPS ставить не стоит...
11.11.2020 18:30
OlegON
 
Код:
#!/bin/bash
sync; echo 3 > /proc/sys/vm/drop_caches
echo EXT4
time rm -rf /mnt/ext4/usr
sync; echo 3 > /proc/sys/vm/drop_caches
echo XFS
time rm -rf /mnt/xfs/usr
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFS
time rm -rf /mnt/btrfs/usr
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFSZ
time rm -rf /mnt/btrfsz/usr
EXT4
real 0m6,529s
user 0m0,202s
sys 0m2,064s

XFS
real 0m8,155s
user 0m0,177s
sys 0m3,344s

BTRFS
real 0m6,672s
user 0m0,165s
sys 0m4,491s

BTRFSZ
real 0m6,794s
user 0m0,163s
sys 0m4,608s

ну, BTRFS тут не хуже EXT4, которая по итогам предыдущего теста с большим количеством файлов тратит около 3 секунд на то, чтобы в mc войти в директорию... Т.е. она просто не чистит метаданные...
Впрочем, так себе тест, поскольку слишком короткие временные промежутки.
11.11.2020 19:43
OlegON
 
Код:
#!/bin/bash
sync; echo 3 > /proc/sys/vm/drop_caches
echo EXT4
time tar -cf /mnt/ext4/usr.tar /mnt/ext4/usr
sync; echo 3 > /proc/sys/vm/drop_caches
echo XFS
time tar -cf /mnt/xfs/usr.tar /mnt/xfs/usr
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFS
time tar -cf /mnt/btrfs/usr.tar /mnt/btrfs/usr
sync; echo 3 > /proc/sys/vm/drop_caches
echo BTRFSZ
time tar -cf /mnt/btrfsz/usr.tar /mnt/btrfsz/usr
EXT4
real 2m54,883s
user 0m1,105s
sys 0m8,173s

XFS
real 2m10,006s
user 0m1,057s
sys 0m6,991s

BTRFS
real 2m0,898s
user 0m1,042s
sys 0m8,518s

BTRFSZ
real 1m36,899s
user 0m1,006s
sys 0m8,864s

Видим, как хорошо помогает компрессия... Вот почему так облажалась ext4 не очень понятно...

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.