Popstas

Записки о Linux

1 Dec 2017, 23:25 - 3 мин читать

Ext4 vs XFS

Мне недавно подсказали посмотреть на файловую систему XFS. Я посмотрел, первые результаты понравились, буду переходить на разделах с кучей файлов.

Немного о моем применении: у нас есть сервер с бекапами, бекапы делаются с помощью rsnapshot, сейчас там около 15 000 000 файлов. Любая попытка просканировать всю файловую систему занимает часы радости не доставляет.

Так вот, для тестов создал на свободном HDD 2 раздела по 50 Гб, залил на них папку с ~ 1 млн файлов на ~ 35 Гб, вот результаты:

1. Заливка файлов:

$ time rsync -a /home/ /tmp/ext4/ \
&& time rsync -a /home/ /tmp/xfs/

rsync -a /home/ /tmp/ext4/  161.20s user 255.46s system 21% cpu 32:06.78 total
rsync -a /home/ /tmp/xfs/  137.56s user 176.48s system 24% cpu 21:46.11 total

Хотя перед первым rsync я прогрел /home/, похоже все-таки xfs прошла настолько быстрее из-за кеша. Или нет.

Дальше я стал учитывать кеш.

2. Повторная синхронизация:

$ echo 3 > /proc/sys/vm/drop_caches && time rsync -a /home/ /tmp/ext4/ \
&& echo 3 > /proc/sys/vm/drop_caches && time rsync -a /home/ /tmp/xfs/

rsync -a /home/ /tmp/ext4/  7.41s user 25.23s system 9% cpu 5:40.08 total
rsync -a /home/ /tmp/xfs/  6.78s user 21.76s system 11% cpu 4:11.81 total

Уже видно, что xfs что-то дает, несмотря на то, что /home был на ext4 (на другом диске).

3. Поиск файлов:

$ echo 3 > /proc/sys/vm/drop_caches && time find /tmp/ext4 | wc -l \
&& echo 3 > /proc/sys/vm/drop_caches && time find /tmp/xfs | wc -l

1185847
find /tmp/ext4  1.94s user 7.76s system 7% cpu 2:02.55 total
wc -l  0.10s user 0.13s system 0% cpu 2:02.55 total

1185847
find /tmp/xfs  1.51s user 3.55s system 10% cpu 46.362 total
wc -l  0.11s user 0.10s system 0% cpu 46.361 total

Уже интереснее, поиск файлов в 2+ раза быстрее!

4. Повторный поиск:

$ echo 3 > /proc/sys/vm/drop_caches && time find /tmp/ext4 | wc -l \
&& echo 3 > /proc/sys/vm/drop_caches && time find /tmp/xfs | wc -l

1185847
find /tmp/ext4  1.84s user 7.01s system 8% cpu 1:43.87 total
wc -l  0.10s user 0.12s system 0% cpu 1:43.87 total
1185847
find /tmp/xfs  1.26s user 3.20s system 14% cpu 30.090 total
wc -l  0.07s user 0.14s system 0% cpu 30.090 total

Видимо, кеши я убиваю не все (может sync помог бы?), но общая картина все равно прекрасная.

5. Удаление файлов:

$ echo 3 > /proc/sys/vm/drop_caches && time rm -rf /tmp/ext4/* \
&& echo 3 > /proc/sys/vm/drop_caches && time rm -rf /tmp/xfs/*

rm -rf /tmp/ext4/*  1.56s user 26.07s system 18% cpu 2:30.88 total
rm -rf /tmp/xfs/*  1.45s user 33.49s system 47% cpu 1:14.33 total

Вывод

Вывод: не вижу причин не переходить, думаю сначала перевести бекапы, потом домашние папки на XFS.

Кстати, гонял еще sysbench, на небольшом количестве файлов разницы нет.

6. Большой поиск файлов

После того, как дописал заметку, переключил диск с бекапами на XFS (как раз досинхронизировался, спустя 2 суток), не мог не написать о первом действительно ощутимом изменении.

Мне нужно было найти и удалить все папки “backup” и удалить их (бинарные бекапы забекапились случайно):

find /var/backups/rsnapshot/ -type d -name "backup"

Так вот, на XFS команда прошла за 19 минут и нашла 240 папок, при этом диск при поиске использовался только наполовину, а IOPS было примерно 1000. (кто дочитал досюда, тот понял, что значит график наверху).

На ext4 та же самая команда на тех же самых файлах нашла 70 папок за 80 минут, загружая диск на 100% с IOPS в среднем 535, потом я устал ждать и остановил поиск. Результат оказался не в 2 раза лучше, как я ожидал, а примерно в 15 раз лучше!