Linux: скільки дискових вводу-виводу потрібно, щоб прочитати файл? Як мінімізувати це? [дублікат]


10

Згідно з цією статтею у Сторінку Facebook:

" Через те, як пристрої NAS управляють метаданими каталогів, розміщення тисяч файлів у каталозі було надзвичайно малоефективним, оскільки блок-карта каталогу була занадто великою, щоб пристрій ефективно кешував. Отже, було прийнято більше 10 операцій на диску, щоб отримати a. Після зменшення розмірів каталогів до сотень зображень у каталозі, в результаті система, як правило, виконує 3 дискові операції для отримання зображення: один для зчитування метаданих каталогів у пам'ять, другий для завантаження вкладки в пам'ять і третій читати вміст файлу. "

Я припускав, що метадані файлів файлової системи та inode завжди будуть кешовані в оперативній пам’яті ОС, і для зчитування файлів зазвичай потрібно всього 1 диск IO.

Це проблема "IO з декількома дисками, щоб прочитати один файл", викладена в цьому папері, унікальна для пристроїв NAS, чи Linux має таку ж проблему?

Я планую запустити сервер Linux для обслуговування зображень. Будь-який спосіб я можу мінімізувати кількість дискових вводу-виводу - в ідеалі переконайтеся, що ОС кешує всі дані каталогу та inode в оперативній пам’яті, а кожен зчитуваний файл вимагатиме не більше 1 дискового вводу?


1
Не відповідь на питання, але ви завжди можете використовувати Varnish (Facebook використовує його), який підтримує файли в пам'яті. Таким чином, якщо одне зображення стане гарячим (багато запитів до одного і того ж файлу), диск IO взагалі не буде використовуватися для його обслуговування

Darhazer - лак тут не допоможе, оскільки кеш файлів Linux (на який покладається Варк) вже кешує гарячі файли в пам'яті. Поставлення лаку перед Nginx для статичного розміщення файлів насправді нічого не додає. Моє запитання про те, коли файли занадто великі / занадто багато, щоб їх було кешовано в пам'яті. Я все ще хотів би переконатися, що принаймні керовані дані та вкладені файли є кешованими, щоб зменшити IO диска до всього 1 за прочитане.

Багато файлових систем зберігають inode всередині каталогу, зменшуючи кількість запитів на один, і значно збільшуючи шанс потрапляння кешу. Але це не питання програмування.
Бен Войгт

Ви можете змінити розмір блоку файлової системи при його створенні, наприклад, mke2fs -b 32768зробити 32k. Однак це корисно лише в тому випадку, якщо у вас немає невеликих файлів у цій файловій системі.

Відповіді:


5

У Linux є та сама «проблема». Ось стаття моєї студентки, опублікована два роки тому, де ефект показаний на Linux. Кілька вводу-виводу можуть надходити з декількох джерел:

  • Пошук каталогів на кожному рівні каталогів шляху файлу. Можливо, буде потрібно прочитати inode каталогу та один або кілька блоків введення каталогу
  • Вкладення файлу

У звичайній схемі вводу-виводу кешування дійсно ефективне, а вклади, каталоги та блоки даних розподіляються способами, що зменшують кількість запитів. Однак звичайний метод пошуку, яким насправді поділяють усі файлові системи, поганий для сильно рандомізованого трафіку.

Ось кілька ідей:

1) Довідка щодо кеш-файлів. Великий кеш поглине більшість прочитаних. Однак, якщо ви хочете поставити кілька дисків у машину, співвідношення диск-оперативна пам’ять обмежує кількість кешу.

2) Не використовуйте мільйони невеликих файлів. Агрегуйте їх у більші файли та збережіть ім’я та зсув у файлі.

3) Розмістіть або кешуйте метадані на SSD.

4) І звичайно використовувати файлову систему, яка не має абсолютно анархічного формату каталогів на диску. Readdir не повинен займати більше лінійного часу, а прямий доступ до файлів в ідеалі просто логарифмічний час.

Зберігання невеликих каталогів (менше 1000 або більше) не повинно настільки допомагати, оскільки вам потрібно більше каталогів, з якими потрібно кешувати.


І звичайно, використовуйте файлову систему, яка не має абсолютно архаїчного формату каталогів на диску. Readdir не повинен займати більше лінійного часу, а прямий доступ до файлів в ідеалі просто логарифмічний час.
jørgensen

Я додав це до відповіді як 4-й пункт
dmeister

@dmeister Хороший матеріал. +1
Магеллан

@dmeister Ваше посилання мертве.
Дон Скотт

1

Це залежить від файлової системи, яку ви плануєте використовувати. Перш ніж прочитати файлову систему даних:

  • Прочитати файл каталогу.
  • Прочитайте inode вашого файлу
  • Прочитайте сектори файлу

Якщо в папці міститься величезна кількість файлів, це великий тиск у кеші.


Якщо ви перераховуєте доступ до вводу / виводу, може бути цікавіше відокремити ті, які виконуються, open()від тих, які виконує read(). На сторінці win.tue.nl/~aeb/linux/vfs/trail.html показано приємне ознайомлення з різними концепціями ядра. (Можливо, це застаріло? Я б не зміг сказати.)
adl

0

Ви, ймовірно, не зможете зберегти всі дані каталогів та inode даних в оперативній пам'яті, оскільки у вас, мабуть, більше даних про каталог та inode, ніж оперативна пам'ять. Ви також можете не захотіти, оскільки ця оперативна пам'ять може бути краще використана для інших цілей; у вашому прикладі зображень, чи не хочете ви мати дані про зображення, яке часто звертається, кешоване в оперативній пам'яті, ніж запис у каталозі для нечасто доступного зображення?

Однак, я думаю, що регулятор vfs_cache_pressure використовується для управління цим. "Коли vfs_cache_pressure = 0, ядро ​​ніколи не відновлює зубні протези і вставки через тиск пам'яті, і це може легко призвести до стану поза пам'яті."

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.