Я хотів би зробити ls -laR /media/myfs
на Linux якомога швидше. У мене буде 1 мільйон файлів у файловій системі, 2 ТБ загального розміру файлів та деякі каталоги, що містять цілих 10000 файлів. Яку файлову систему я повинен використовувати та як її налаштувати?
Наскільки я розумію, причина, чому ls -laR
це повільно, тому що вона має stat(2)
кожний inode (тобто 1 мільйон stat(2)
с), а оскільки inode розподіляються випадковим чином на диску, кожен stat(2)
потребує одного пошуку диска.
Ось декілька рішень, які я мав на увазі, жодним із яких я не задоволений:
Створіть файлову систему на SSD, оскільки операції пошуку на SSD швидко проходять. Це не буде працювати, тому що 2 ТБ SSD не існує, або це надмірно дорого.
Створіть файлову систему, яка охоплює два блокові пристрої: SSD та диск; диск містить файлові дані, а SSD містить всі метадані (включаючи записи каталогів, inode та розширені атрибути POSIX). Чи існує файлова система, яка підтримує це? Чи пережив би це крах системи (відключення електроенергії)?
Використовуйте
find /media/myfs
замість ext2, ext3 або ext4,ls -laR /media/myfs
тому що перший може перевагаd_type
поля (див. Наgetdents(2)
сторінці man), тому він не повинен стати статистичним. На жаль, це не відповідає моїм вимогам, оскільки мені також потрібні всі розміри файлів, якіfind /media/myfs
не друкуються.Використовуйте файлову систему, таку як VFAT, яка зберігає входи у записах каталогу. Я хотів би цього, але VFAT для мене недостатньо надійний і гнучкий, і я не знаю жодної іншої файлової системи, яка б це робила. Чи ти? Звичайно, зберігання inode у записах каталогу не працюватиме для файлів із кількістю посилань більше 1, але це не проблема, оскільки у моєму використанні є лише кілька десятків таких файлів.
Відрегулюйте деякі параметри приблизно
/proc
абоsysctl
так, щоб узори заблоковані в системній пам'яті назавжди. Це не прискорить першеls -laR /media/myfs
, але зробить усі наступні виклики дивовижно швидкими. Як я можу це зробити? Мені ця ідея не подобається, тому що вона не прискорює першу виклик, яка наразі займає 30 хвилин. Також я хотів би зафіксувати розширені атрибути POSIX у пам'яті. Що мені робити для цього?Використовуйте файлову систему, яка має онлайн-інструмент дефрагментації, який може бути доручений перенести входи до початку блокового пристрою. Після того, як переміщення буде зроблено, я можу запустити,
dd if=/dev/sdb of=/dev/null bs=1M count=256
щоб отримати початок блокового пристрою, що піднімається до кешу пам’яті ядра, не шукаючи, і тодіstat(2)
операції будуть швидкими, оскільки вони читаються з кеша. Чи є спосіб заблокувати ці входи та / або блоки в пам'яті, коли їх прочитали? Яка файлова система має такий інструмент дефрагментації?
find
є -printf
(і в Linux це повинно бути), ви можете виводити ту саму інформацію, що і ls -l
(крім того, що find
є -ls
). Однак stat
для отримання цієї інформації все одно доведеться зробити . Ви розглядали можливість використання locate
чи подібну схему?
locate
, і це може бути корисним рішенням. Але мені все ж цікаво отримати відповідь на моє запитання.