Назад | Перейти на главную страницу

Кеширование / предварительная загрузка файлов в Linux в RAM

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

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

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

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

Любые идеи?

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

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

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

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

vmtouch руководство

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

Example 5

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

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

РЕДАКТИРОВАТЬ2: Так как принято к сведению в комментариях теперь есть репозиторий git доступный.

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

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

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

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

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

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

 # mount -t ramfs ram /mnt/ram 

или

 # mount -t tmpfs tmp /mnt/tmp

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

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

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

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

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

обмен

сообщает ядру Linux, насколько активно оно должно использовать подкачку. Цитата из статьи в Википедии:

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

vfs_cache_pressure

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

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

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


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

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

Вы можете иметь программу, которая просто mmaps ваши файлы будут продолжать работать.

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

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

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

Я использую строку find / -name случайного символа, это очень помогает

Я только что попробовал dd if = / dev / yourrootpartition of = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

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

http://www.coker.com.au/memlockd/ Является ли это

хотя вам это действительно не нужно, linux сам по себе неплохо кэширует файлы, которые вы используете.

Настольные компьютеры (например, ubuntu) уже используют файлы предварительной загрузки (по крайней мере, популярные разделяемые библиотеки) в память при загрузке. Он используется для ускорения загрузки и запуска различных рекламное ПО такие как FF, OO, KDE и GNOME (с расширением-рассылкой evolution).

Инструмент назван читать вперед http://packages.ubuntu.com/dapper/admin/readahead

Также имеется соответствующий системный вызов: опережение (2) http://linux.die.net/man/2/readahead

Также есть проект демона предварительной загрузки: http://linux.die.net/man/8/preload

Думаю, это лучше решить на уровне приложений. Например, для этого, вероятно, существуют специализированные веб-серверы, или вы можете рассмотреть mod_cache с Apache. Если у вас есть конкретная цель, например, более быстрое обслуживание веб-контента, я думаю, вы можете добиться улучшений в подобных вещах.

Но ваш вопрос носит общий характер, подсистема памяти Linux предназначена для обеспечения наилучшего общего использования ОЗУ. Если вы хотите нацеливаться на определенные типы производительности, подумайте о поиске всего в / proc / sys / vm.

Пакет fcoretools интересен, мне были бы интересны любые статьи о его применении ... Эта ссылка говорит о реальных системных вызовах, используемых в приложении.

Что касается вашего последнего вопроса, убедитесь, что ваша оперативная память находится на разных каналах памяти, чтобы процессор мог получать данные параллельно.

Вы можете использовать различные системы ramfs (например, ramfs, tmpfs), но в целом, если файлы на самом деле читаются так часто, они остаются в кеше вашей файловой системы. Если ваш рабочий набор файлов больше, чем ваш свободный RAM, то файлы из него будут очищены, но если ваш рабочий набор больше, чем ваш свободный RAM, вы также не поместите его все в RAM.

Проверьте вывод команды «free» в оболочке - значение в последнем столбце под «Cached» указывает, какая часть вашей свободной оперативной памяти используется для кеширования файловой системы.

Не совсем то, что просили, но я использую

найти BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

для запуска инициализации файлов в томе AWS, созданного из моментального снимка. Это более сфокусировано, чем официальная рекомендация использовать dd, если вы просто хотите прочитать некоторые файлы.

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

найти . -exec cp {} / dev / null \;

И эти файлы кешируются