Совместимы ли расширенные регулярные выражения Unix?

Согласно open(2) man page:

   O_DIRECT (since Linux 2.4.10)
          Try to minimize cache effects of the I/O to and from this
          file.  In general this will degrade performance, but it is
          useful in special situations, such as when applications do
          their own caching.  File I/O is done directly to/from user-
          space buffers.  The O_DIRECT flag on its own makes an effort
          to transfer data synchronously, but does not give the
          guarantees of the O_SYNC flag that data and necessary metadata
          are transferred.  To guarantee synchronous I/O, O_SYNC must be
          used in addition to O_DIRECT.  See NOTES below for further
          discussion.

Из раздела NOTES:

   O_DIRECT support was added under Linux in kernel version 2.4.10.
   Older Linux kernels simply ignore this flag.  Some filesystems may
   not implement the flag and open() will fail with EINVAL if it is
   used.

Итак, O_DIRECT раньше просто игнорировался. И из LKML, всего пару месяцев назад:

Какая разница, как файловая система реализует O_DIRECT, если она не портит данные? ext3 во многих ситуациях возвращалась к буферизованному вводу-выводу, но единственной жалобой на это была производительность. Иными словами, уже давно верно, что если пользователь заботится о производительности O_DIRECT производительность, то он нужно быть осторожным в выборе файловой системы.

Но если для поддержки O_DIRECT требуется всего 5 строк кода на файловую систему... правильно через буферизованный ввод-вывод, то почему именно пользовательское пространство должно прыгать через обручи для явной обработки отказа open(O_DIRECT)?

Особенно если учесть, что все, что они могут сделать, это вернуться к буферизованный ввод-вывод самих себя....

Я написал контраргументы для всего этого, но лучше не стал. об этом. Старые версии ядра просто игнорируют O_DIRECT, так что явно есть прецедент.

Учитывая это, кажется, что вы можете просто игнорировать его. Ключевой фразой, похоже, является "не испортить данные".

Пока что.

Обратите также внимание, что в вашем связанном вопросе есть ответы, в которых говорится, что O_DIRECT бесполезен по причинам производительности. Это просто неверно. Передача данных через кэш страниц происходит медленнее, чем не передача через кэш страниц. Это может быть значительным на оборудовании, способном передавать гигабайты в секунду. И если вы обрабатываете каждый бит данных только один раз, кэширование буквально бесполезно, но оно будет оказывать ненужное влияние на всю систему.

Прошло несколько лет с тех пор, как я написал модуль файловой системы Linux. К сожалению, я не помню, как системы VFS обрабатывают кэширование.

1
23.02.2018, 16:06
0 ответов

Теги

Похожие вопросы