Використання O_DIRECT в Linux


24

Якщо це питання занадто орієнтоване на програмування, дайте мені знати. Цікаво, чи є люди, знайомі з прапором O_DIRECT для системного виклику open () на Linux 2.6? Лінус зневажає його використання, проте, як видається, написання файлів високої продуктивності вказує на його використання. Я хотів би знати про будь-який реальний досвід та рекомендації у світі.

Більше інформації: Додаток, який я використовую , підтримує власний кеш, і при цьому набирає в середньому 5-кратну або більше прискорення. Під час запису у файл вміст кешу повинен бути записаний у кеш файлової системи, що здається зайвим і викликає занепокоєння у роботі.

Відповіді:


17

Гаразд, ви запитуєте досвід, це робить питання трохи суб'єктивним та аргументативним, але прохідним.

Лінус сказав, що посилаючись на способи використання, які люди зазвичай приписують O_DIRECT, і для цих цілей IMO Linus здебільшого вірно. Навіть якщо ви робите прямий ввід / вивід, ви не можете передавати дані на / з пристроїв безпосередньо до програмних заяв, вам потрібен буфер, який заповнюється (програмою чи пристроєм) і передається через системний виклик на інший кінець. Крім того, щоб зробити його ефективним, ви не хочете перечитувати щось, що ви вже прочитали, якщо вам це буде потрібно знову. Тож вам потрібен якийсь кеш ... і саме це ядро ​​надає без O_DIRECT, кеш сторінки! Чому б не використати це? Він також отримує переваги, якщо більшість процесів хочуть одночасно отримувати доступ до одного файлу, це буде катастрофою з O_DIRECT.

Сказавши це, O_DIRECT використовує: Якщо з якихось причин вам потрібно отримати дані безпосередньо з блокового пристрою. Це не має нічого спільного з продуктивністю.

Люди, які використовують O_DIRECT для продуктивності, зазвичай походять із систем з алгоритмами кешування поганих сторінок або без механізмів поради POSIX, або навіть люди бездумно повторюють те, що сказали інші. Щоб уникнути цих проблем, O_DIRECT був рішенням. Linux, OTOH, має філософію, що слід виправити реальну основну проблему, а основна проблема - ОС, які погано спрацювали з кешуванням сторінок.

Я використовував O_DIRECT для простої реалізації кота, щоб знайти помилку пам’яті в своїй машині. Це одне дійсне використання для O_DIRECT. Це не мало нічого спільного з роботою.


Дякую за інформацію, це вдячно. Я оновив своє запитання із специфічними умовами програми, яка спонукала це питання. Якщо у вас є детальніша інформація про механізми поради POSIX щодо запису файлів, це також буде вдячно.
casualunixer

4
o_direct також може бути корисним у системі, де розробник хоче забезпечити механізм кешування на рівні програми (думаю, бази даних).
Jmoney38

Це не має нічого спільного з продуктивністю. Це не завжди відповідає дійсності, особливо для доступу до високошвидкісного пристрою, на якому коефіцієнт введення-виведення даних суперечить пропускній здатності пам’яті або навіть просто значному відсотку пропускної здатності пам’яті. У такому випадку пропуск додаткової копії до / з кешу сторінки може мати значні переваги від продуктивності.
Ендрю Генле

14

Насправді, O_DIRECT це потрібно, щоб уникнути жодного з

  • забруднення кешу - іноді ви знаєте, що немає сенсу надмірних витрат з кешуванням, наприклад, наприклад, при роботі з дійсно великими файлами, скажімо, 64 GiB, коли є лише 2 ГБ оперативної пам’яті. Торрент-файл розміром 32 GiB, який користувач вирішив перевірити, здається, не є хорошим кандидатом на кешування. Це просто додаткова активність із власними накладними витратами. І це може призвести до викреслення деяких дійсно корисних даних із кешу.
  • подвійне кешування - наприклад, деякі RDBMSes (згадайте MySQL) дозволяє визначити власний кеш. Бази даних нібито краще знають, як кешувати і що, ніж віртуальна пам'ять ядра, яка нічого не знає про планування SQL тощо.

- що не добре, як здається. І O_DIRECTне означає бути швидшим, часто це не так .


10
posix_fadviseможе вирішити проблему забруднення кешу.
psusi

Я не думаю, що віртуальна пам'ять нічого спільного з цим не має, вона просто відображає адресу пам'яті. Буфер кеш / Кеш сторінки - це те, що ви маєте на увазі.
АрекБульський

Наскільки я можу сказати, кеші / кешування є частиною підсистеми VM в UNIX, тому я використовував цей термін. Дякуємо за редагування :)
poige

6

Зверніть увагу, що використання O_DIRECTнових ядер із новішими файловими системами може призвести до відмови. Наприклад, дивіться цей звіт про помилку . Тож використання не тільки часто сумнівне, воно, ймовірно, не спрацює у майбутньому поколінні дистрибутивів Linux. Тож я не ставлю ставку на виконання свого коду, навіть якщо ви зможете довести, що це може мати користь.


1
Звіт про помилку фактично обговорює використання файлових систем із включеним параметром journal = data. Ця опція діє прямо протилежно прапору O_DIRECT. У більшості файлових систем ext3 та ext4 цей прапор не встановлений, і якщо вони є, вимкнення його дозволить відкрити файл за допомогою O_DIRECT.
casualunixer

3

Це має багато спільного з продуктивністю.

Цікавий приклад - у mongodb із використанням двигуна mmap. O_DIRECT найкраще використовувати, як заявили інші, де дані навряд чи читатимуться деякий час. У mongodb журнал бази даних пишеться за допомогою O_DIRECT, тоді як записи даних та індексів обробляються механізмом кешування сторінок (pdflush), оскільки, хоча O_DIRECT пропонує меншу пропускну здатність, це також означає меншу затримку, а отже, зменшує втрату даних у випадку несподіване відключення (паніка ядра, збій диска або живлення). Зауважте, що ще існує буферизація, перш ніж запис O_DIRECT буде здійснено для енергонезалежного зберігання, це просто зменшує втрату даних.

Ще одна важлива особливість O_DIRECT полягає в тому, що він забезпечує більший контроль над послідовністю запису. Знову ж таки, це не гарантує порядок запису (якщо ви не маєте енергонезалежного контролера дискового кешування і не використовуєте планувальник fifo, але у них є свої ускладнення). Отже, хоча mysql використовує O_DIRECT для своїх даних / індексів, а також журналів, можна очікувати, що останній буде вчинений першим.

Але важливо пам’ятати, що O_DIRECT порушує справедливість у розподілі ресурсів. Однією з причин прискорення вашої заявки є те, що вона сповільнює інші речі.


Ви кажете, що це має багато спільного з продуктивністю, але ви надаєте приклад, коли він використовується або для зменшення затримки, або для запису замовлення. Але я згоден, що це впливає на продуктивність. Справедливий пункт про справедливість.
ArekBulski

Чи можете ви надати більше посилань, що пояснюють, коли це несправедливо?
ACyclic

3

Що стосується того, що @Juliano вже сказав.

Перевірте, posix_fadviseчи справжньою проблемою є неправильне поведінка основного алгоритму кешування файлової системи, ви можете спробувати дати йому поради, як ви будете використовувати файлову систему. Для добре реалізованих fs він повинен дати підвищення продуктивності. (Тут посилання на іншу тему, що стосується подібних міркувань /programming//a/3755818/544721 )


1
Схоже, posix_fadvise змінює алгоритми перечитування, використовувані ядром. Критичним фактором із кодом у питанні є продуктивність запису. Проблема полягає в тому, що виписування буфера спочатку заповнює кеші Linux, які ядро ​​потім має скидати, коли у нього не вистачає пам'яті. Це марна витрата зусиль, вихід у цьому випадку повинен бути мінімально захищеним від шляху до диска.
casualunixer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.