Оптимизация FFS через dirhash

Опубликовано 01.07.2025 в OpenBSD

OpenBSD справедливо критикуют за "медленную" файловую систему FFS - по моим ощущениям, это достаточно стабильная и проверенная временем файловая система, вполне подходящая для домашнего десктопа/лэптопа, а также для не сильно нагруженного сервера вроде того, с которого вы получили эту статью. Но для создания высоконагруженного файлообменника или медиасервера с тяжелым контентом - да, FFS определенно является не лучшим выбором.

Масла в огонь подлило удаление сравнительно недавно (начиная с OpenBSD 7.4, если мне не изменяет память) механизма "soft updates" (отложенная запись метаданных без блокировки ввода-вывода), который по некоторым (старым, правда) сравнениям не только снижал вероятность повреждения ФС при сбоях, но и раза в три повышал производительность дискового ввода-вывода. Как сказал кто-то из причастных, "эта штука слишком умная, чтобы мы могли ее поддерживать как есть" и "возможно когда-нибудь, когда мы переработаем слой VFS, soft updates вернутся". Что в случае OpenBSD означает "возможно и никогда", ибо дефицит ресурсов разработки...

После удаления вышеупомянутых softdep всё, что нам доступно в плане повышения производительности FFS - это, разве, монтирование файловых разделов с опцией noatime (не записывать в метаданные дату-время последнего доступа к файлу), но как, опять же, кто-то справедливо заметил, если noatime дает ощутимый прирост производительности - то вам уже очень давно пора заменить ваше железо.

Так я считал долгое время. И был неправ! Все-таки есть вариант чуть-чуть подтюнить FFS в плане быстродействия, его описал в своем блоге широко известный в узких кругах Rafael Sadowski:
https://rsadowski.de/posts/2025/ffs-optimizations-dirhash/
а бессмертный ресурс undeadly.org, который я нет-нет, да и мониторю, пропиарил эту полезную статью:
https://www.undeadly.org/cgi?action=article;sid=20250609073248

В общем, дело простое: в OpenBSD существует кеш в памяти, куда прикапываются в виде хэш-таблицы результаты поиска по большим каталогам, что существенно ускоряет такой поиск в дальнейшем. И по умолчанию объем памяти, выделяемый под такой кеш, выбран в духе OpenBSD - то есть по принципу "ни нашим, ни вашим, и для десктопа, и для сервера, для старого утюга и модных архитектур". А именно - он равен 5 (пяти) мегабайтам. Чего, к слову, вполне достаточно для моего сервера, например, но вот резко недостаточно для моего же десктопа. К счастью, это легко подтюнить, увеличив размер кеша, скажем, до 50 Мб:

doas sysctl vfs.ffs.dirhash_maxmem=52428800

после чего можно проверить, инициировав максимально широкий поиск, на сколько он у вас заполнится:

doas find / >/dev/null && sysctl vfs.ffs
vfs.ffs.dirhash_dirsize=2560
vfs.ffs.dirhash_maxmem=52428800
vfs.ffs.dirhash_mem=12200106

В моем случае, как видите, использовано что-то около 11 Мб из 50, что является приемлемым результатом (так и оставлю, учитывая, что количество среплицированных локально репозиториев всяких интересных проектов и просто прикопанных файлов у меня постепенно прирастает, а оперативной памяти 16 Гб).

Насколько мне это увеличило быстродействие FFS? Честно скажу - не ощутил особого прироста (впрочем, я ранее и тормозов особых тоже не ощущал).

Но сам факт доставляет некоторое удовольствие: я еще чуть больше узнал про любимую операционную систему и оптимизировал ее под свои нужды.

P.S. Разумеется, чтобы настройка сохранилась после перезагрузки системы, не забываем ее вписать в /etc/sysctl.conf