Linux

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

У меня довольно старый сервер с 8 ГБ оперативной памяти, и он практически весь день обслуживает одни и те же файлы, но делает это с жесткого диска, в то время как 5 ГБ оперативной памяти «свободны». Любой, кто когда-либо пробовал работать с ram-диском, может подтвердить, что это потрясающе с точки зрения скорости. Использование памяти в этой системе обычно не превышает 2GB/6GB, поэтому я хочу знать, есть ли способ использовать эту дополнительную память для чего-то хорошего. Можно ли указать файловой системе всегда обслуживать определенные файлы из оперативной памяти? Есть ли другие методы, которые я могу использовать для улучшения возможностей чтения файлов за счет использования оперативной памяти?

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

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

  1. Веб-серверы со статическими файлами, которые часто читаются.

  2. Серверы приложений с большими библиотеками.

  3. Настольные компьютеры со слишком большим объемом оперативной памяти.

Есть идеи?

Ответ 1

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

  1. запрос о том, какая часть каталога кэширована;

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

  3. загрузка файла в кэш;

  4. удалить файл из кэша;

  5. блокировать файлы в кэше;

  6. запуск в качестве демона.

Ответ 2

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

 # mount -t ramfs ram /mnt/ram 

 или

 # mount -t tmpfs tmp /mnt/tmp

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

Ответ 3

После длительного чтения о функциях подкачки и кэширования страниц в ядре, я нашел «fcoretools», который состоит из двух инструментов:

  1. fincore: выясняет, сколько страниц приложение хранит в памяти ядра;

  2. fadvise: позволяет манипулировать памятью ядра (страничным кэшем).

Ответ 4

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

swappiness

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

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

vfs_cache_pressure

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

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

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

При установке высокого значения swappiness (например, 100) ядро перемещает в своп все, что ему не нужно, освобождая оперативную память для кэширования файлов. А если установить vfs_cache_pressure ниже (скажем, на 50, а не на 0!), оно будет отдавать предпочтение кэшированию файлов, а не хранению данных приложения в оперативной памяти.

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

Ответ 5

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

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

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

Схожие статьи

Linux

Как часто следует перезагружать серверы Linux?

Linux

Что такое «POSIX»?

Linux

Как быстро скопировать большое количество файлов между двумя серверами

Linux

Как завершить дочерний процесс по истечении заданного времени ожидания в Bash