Вопрос: Кэширование / предварительная загрузка файлов на Linux в оперативную память


У меня довольно старый сервер с 4 ГБ оперативной памяти, и он в значительной степени обслуживает одни и те же файлы весь день, но он делает это с жесткого диска, а 3 ГБ оперативной памяти «свободны».

Любой, кто когда-либо пытался запустить ram-drive, может засвидетельствовать, что это здорово с точки зрения скорости. Использование этой системы в памяти обычно не превышает 1 ГБ / 4 ГБ, поэтому я хочу знать, есть ли способ использовать эту дополнительную память для чего-то хорошего.

  • Можно ли указать файловой системе всегда обслуживать определенные файлы из ОЗУ?
  • Существуют ли какие-либо другие методы, которые я могу использовать для улучшения возможностей чтения файлов с помощью ОЗУ?

В частности, я не ищу здесь «взломать». Я хочу, чтобы системные вызовы файловой системы обслуживали файлы из ОЗУ без необходимости создавать ram-drive и копировать файлы там вручную. Или, по крайней мере, сценарий, который делает это для меня.

Возможные применения здесь:

  • Веб-серверы со статическими файлами, которые читаются много
  • Серверы приложений с большими библиотеками
  • Настольные компьютеры со слишком большим объемом ОЗУ

Есть идеи?

Редактировать:

  • Нашли это очень информативное: Кэш страницы Linux и pdflush
  • Как заметил Зан, память на самом деле не свободна. Я имею в виду, что он не используется приложениями, и я хочу контролировать то, что должно быть кэшировано в памяти.

58
2017-07-21 07:01


Источник


Я тоже ищу что-то в этом духе. Я не думаю, что общее кэширование блоков файловой системы - это ответ. Предположим, что я хочу, чтобы блок X диска всегда был кэширован. Что-то обращается к нему, и ядро ​​кэширует его. Пока все хорошо, но следующий процесс требует блока Y, поэтому ядро ​​отбрасывает мой блок X и вместо этого кэширует Y. Следующему процессу, который хочет X, придется ждать, пока он оторвется от диска; это то, чего я хочу избежать. Я бы хотел (и то, что я думаю, что исходный плакат тоже) заключается в наложении кэша записи в файловую систему, которая гарантирует, что файлы всегда
Учитывая, что консенсус, похоже, заключается в том, что Linux уже должен кэшировать часто используемые файлы для вас, мне интересно, действительно ли вам удалось сделать какие-либо улучшения, используя приведенные здесь рекомендации. Мне кажется, что попытка ручного управления кэшированием может быть полезна для разминки кеша, но с использованием шаблона использования, который вы описываете («обслуживать одни и те же файлы весь день»), это не поможет уже разогнанному серверу много, если вообще. - Nate C-K
Вы говорите, что не ищете взлома, но Linux уже делает то, что вы хотите делать по умолчанию. Следующее уравнение: «обслуживание одинаковых файлов в течение всего дня» + «сообщает файловой системе, что она всегда обслуживает определенные файлы из ОЗУ» по определению означает «взломать». Вы заметили какие-либо улучшения в производительности? По моему опыту, кеш Linux из beieezus из вашей файловой системы читается. - Mike S
Для выяснения, linux действительно кэширует файлы, но метаданные проверяются для каждого файла для каждого запроса. На вращающейся ржавчине на занятом веб-сервере с большим количеством мелких файлов, которые все еще могут вызывать конкуренцию ИО и преждевременно изнашивать диски. Статический контент и скрипты могут быть rsync в / dev / shm или пользовательский монтируемый tmpfs при запуске приложения. Я сделал это в течение пары десятилетий, и мои диски не изнашиваются преждевременно. Также мои сайты выдерживают тяжелую взрывную нагрузку намного лучше. Это помогает на чем угодно: от самого дорогого аппаратного оборудования до коммодированного оборудования. - Aaron


Ответы:


vmtouch кажется хорошим инструментом для работы.

Особенности:

  • спросить, какая часть каталога кэширована
  • запрос, сколько файлов кэшируется (также какие страницы, графическое представление)
  • загружать файл в кеш
  • удалить файл из кеша
  • блокировать файлы в кеше
  • работать как демон

Руководство пользователя vmtouch

РЕДАКТИРОВАТЬ: Использование, указанное в вопросе, приведено в примере 5 на vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: В виде отметил в комментариях есть репозиторий git доступный.


44
2017-09-01 21:40



Для будущих зрителей попробуйте использовать vmtouch репозиторий git вместо того, чтобы следовать инструкциям на связанной странице. Таким образом вы получаете make-файл и можете получать обновления. - randomous
Кажется, что размер файла ограничен (4 ГБ). Есть ли другая альтернатива? - Alix Axel


Это также возможно, используя vmtouch Виртуальная память Toucher утилита,

Этот инструмент позволяет вам управлять кешем файловой системы в системе Linux. Вы можете принудительно или заблокировать определенный файл или каталог в подсистеме кэша VM или использовать его для проверки, чтобы увидеть, какие части файла / каталога содержатся в VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Или...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

24
2017-10-23 16:50



это отличная утилита и делает именно то, что запросил ОП. Если бы он принял это как ответ. - laebshade
Вы знаете, работает ли это с ZFS? - CMCDragonkai
@CMCDragonkai Я не думаю, что это необходимо с ZFS ... Думайте: ARC и L2ARC, - ewwhite


После некоторого подробного ознакомления с функциями замены 2.6 и кэширования страниц я нашел «fcoretools». Который состоит из двух инструментов;

  • fincore: покажет, сколько страниц приложение хранило в основной памяти
  • fadvise: Позволяет манипулировать основной памятью (страница-кеш).

(Если кто-то найдет это интересным, я публикую это здесь)


17
2017-07-21 08:09



Я подумал, что есть программа, чтобы сделать это где-то. +1 - Brad Gilbert


Уловка бедняка для получения информации в кеш файловой системы - это просто кошка и перенаправление на / dev / null.


16
2017-07-21 07:19



Согласен. И если вы хотите, чтобы определенные файлы были кэшированы, выполните задание cron, которое cats файл в / dev / null периодически - Josh


Linux будет кэшировать как можно больше дискового ввода-вывода в памяти. Это такова статистика кэша и буферной памяти. Вероятно, это будет лучше, чем вы, чтобы сохранить правильные вещи.

Однако, если вы настаиваете на сохранении ваших данных в памяти, вы можете создать привод ram с использованием tmpfs или ramfs. Разница заключается в том, что ramfs будет выделять всю память, которую вы запрашиваете, поскольку tmpfs будет использовать только память, которую использует ваше блочное устройство. Моя память немного ржавая, но вы должны уметь:

 # mount -t ramfs ram /mnt/ram 

или

 # mount -t tmpfs tmp /mnt/tmp

а затем скопируйте данные в каталог. Очевидно, что когда вы выключите или отключите этот раздел, ваши данные будут потеряны.


15
2017-07-21 07:17



Спасибо за ваш ответ, но это, очевидно, то, чего я хочу избежать. В противном случае я бы просто сценарий, чтобы компьютер создавал ramdrive, копировал файлы и символически ссылался на ramdrive. Но тогда мои данные непоследовательны. Я надеялся на файловую систему, где я могу «пометить» определенные файлы, которые будут кэшироваться в памяти. Но, может быть, я слишком оптимистичен. - Andrioid
Вы «тегируйте» файлы, которые будут кэшироваться, обращаясь к ним. - womble♦
Если бы был только способ автоматически пометить наиболее часто используемые файлы. - David Pashley
Blimey, сарказм не путешествует хорошо делает это :) - David Pashley
Да спасибо. Я понимаю концепцию кэширования IO. Я даже объяснил это в своем ответе. Кажется, вы не читали тонкий комментарий, что это был сарказм. - David Pashley


Есть две настройки ядра, которые могут значительно помочь даже без использования других инструментов:

swappiness

говорит linux ядро, насколько агрессивно он должен использовать swap. Цитирование статьи в Википедии:

Swappiness - это свойство ядра Linux, которое изменяет баланс между заменой памяти во время выполнения, в отличие от удаления страниц из кеша системной страницы. Swappiness может быть установлен в значения от 0 до 100 включительно. Низкое значение означает, что ядро ​​попытается избежать как можно большего количества обменов, где более высокое значение вместо этого заставит ядро ​​агрессивно попытаться использовать пространство подкачки. Значение по умолчанию - 60, а для большинства настольных систем установка 100 может повлиять на общую производительность, тогда как установка его ниже (даже 0) может улучшить интерактивность (уменьшая задержку ответа).

vfs_cache_pressure

Цитата из vm.txt:

Управляет тенденцией ядра восстанавливать память, которая используется для   кэширование каталогов и объектов inode.

При значении по умолчанию vfs_cache_pressure = 100 ядро ​​будет пытаться   восстанавливать зубные щетки и иноды по «справедливой» ставке в отношении pagecache и   восстановление swapcache. Уменьшение vfs_cache_pressure заставляет ядро ​​предпочитать   для сохранения зубных и inode-кэшей. ...


Установив swappiness high (например, 100), ядро ​​перемещает все, что ему не нужно менять, освобождая RAM для кеширования файлов. И установив vfs_cache_pressure ниже (скажем, до 50, а не до 0!), это будет способствовать кэшированию файлов вместо хранения данных приложения в ОЗУ.

(Я работаю над большим проектом Java, и каждый раз, когда я его запускаю, он занимал много оперативной памяти и очищал кеш диска, поэтому в следующий раз, когда я скомпилировал проект, все было снова прочитано с диска. При настройке этих двух параметров я управляю для сохранения источников и скомпилированного вывода в ОЗУ, что значительно ускоряет процесс.)


4
2017-10-23 16:17





Я очень сомневаюсь, что он фактически служит для файлов с диска с 3 ГБ оперативной памяти. Кэширование файлов Linux очень хорошее.

Если вы видите диск IO, я бы посмотрел ваши конфигурации ведения журнала. Многие журналы устанавливаются как небуферизованные, чтобы гарантировать, что последняя информация журнала доступна в случае сбоя. В системах, которые должны быть быстрыми независимо, используйте буферизованный журнал IO или используйте удаленный сервер журнала.


2
2017-07-21 07:11



Правильно, я просто хочу контролировать то, что кэшируется. - Andrioid


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


2
2017-07-21 07:44