Чтение файла без удаления из кэша страницы ОС - PullRequest
2 голосов
/ 15 марта 2012

(Это предназначено в первую очередь для Linux или, в идеале, для любой системы POSIX.)

Я ищу способ чтения большого количества файлов (любой из которых может иметь размер до 1 ГБ сам по себе) со следующими характеристиками, когда я читаю страницы в:

  • Если соответствующая страница диска уже находится в кеше файловой системы, она используется.
  • Если соответствующая страница не находится в кэше диска, она извлекается с диска, но все существующие страницы кэшированного диска не удаляются.

Идея состоит в том, чтобы иметь возможность читать все эти файлы, не загрязняя кэш диска и не удаляя текущий рабочий набор.

Любое руководство?

Ответы [ 4 ]

3 голосов
/ 15 марта 2012

В Linux вы можете поэкспериментировать с флагом O_DIRECT open().man open(2):

   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 at an effort to transfer data
          synchronously, but does not give the guarantees  of  the  O_SYNC
          that  data and necessary metadata are transferred.  To guarantee
          synchronous I/O the O_SYNC must be used in addition to O_DIRECT.
          See NOTES below for further discussion.
2 голосов
/ 20 марта 2012

Лучший способ сделать это, вероятно, с posix_fadvise().Применение флага POSIX_FADV_NOREUSE ко всему файлу перед чтением кажется наиболее подходящим;к сожалению, этот флаг ничего не делает с текущими ядрами.

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

1 голос
/ 19 августа 2015

Используя posix_fadvise, вы можете намекнуть ОС, что она должна удалить определенные файловые блоки из кэша. Вместе с информацией из mincore, которая сообщает нам, какие блоки в настоящее время кэшируются, мы можем изменить работу приложений, не нарушая буферный кеш.

Этот восхитительный обходной путь для [не] реализованных функций ядра подробно описан:

http://insights.oetiker.ch/linux/fadvise/

[Редактировать] Последствия упреждающего чтения ядра

Для полной производительности чтения, вы должны обязательно отбрасывать только те страницы, которые вы уже прочитали. В противном случае вы отбросите страницы, которые ядро ​​услужливо читает заранее :). (Я думаю, что это должно быть определено как неправильное предвидение readahead, которое могло бы отключить его и, по крайней мере, избежать большого количества потерянного ввода-вывода. Но упреждающее чтение очень полезно, поэтому вы должны избегать его отключения).

Кроме того, держу пари, что если вы тестируете страницы непосредственно перед последним чтением, они всегда отображаются как встроенные. Это не скажет вам, использовал ли кто-то еще их или нет. Все, что он покажет, это то, что ядро ​​с опережением чтения работает:).

Код в связанном патче rsync должен быть в порядке (игнорируя хак с "массивом всех fds"). Он проверяет весь файл перед первым чтением. Это разумно, потому что требуется только внутреннее выделение 1 байта на страницу файла 4 КБ.

0 голосов
/ 15 марта 2012

Размер кэша страницы динамически изменяется в зависимости от объема памяти, запрашиваемой различными процессами, обратной записи ввода-вывода и т. Д., Которые происходят в системе.Вы можете настроить значение / proc / sys / vm / swappiness.

...