it-swarm.xyz

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

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

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

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

Точнее, я не ищу здесь "взлом". Я хочу, чтобы вызовы файловой системы обслуживали файлы из RAM) без необходимости создавать оперативную память и копировать туда файлы вручную. Или, по крайней мере, скрипт, который делает это для меня.

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

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

Любые идеи?

Правка:

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

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-репозиторий .

60
seeker

Это также возможно с помощью утилиты vmtouch Virtual Memory Toucher .

Инструмент позволяет контролировать кэш файловой системы в системе Linux. Вы можете принудительно заблокировать или заблокировать определенный файл или каталог в подсистеме кэша 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
26
ewwhite

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

23
cagenut

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

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

 # mount -t ramfs ram /mnt/ram 

или

 # mount -t tmpfs tmp /mnt/tmp

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

18
David Pashley

После тщательного изучения возможностей подкачки ядра 2.6 и кэширования страниц я нашел 'fcoretools'. Который состоит из двух инструментов;

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

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

18
Andrioid

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

swappiness

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

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

vfs_cache_pressure

Цитирование из vm.txt :

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

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


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

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

7
Petr Pudlák

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

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

3
Zan Lynx

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

3
Brad Gilbert

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

3
Thorbjørn Ravn Andersen

http://www.coker.com.au/memlockd/ делает это

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

0
Justin

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

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

0
Daniel Lawson

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

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

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

0
Federico

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

0
sybreon

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

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

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

0
Kyle Brandt

я только что попробовал dd, если =/dev/yourrootpartition =/dev/null\bs = 1Mcount = howmuchmemoryyouwanttofill

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

0
Bogus Name

Настольные компьютеры (например, Ubuntu) уже используют предварительную загрузку файлов (по крайней мере, популярных общих библиотек) в память при загрузке. Он используется для ускорения загрузки и запуска различных bloarware таких как FF, OO, KDE и GNOME (с эволюцией bloat-mailer).

Инструмент называется readahead http://packages.ubuntu.com/dapper/admin/readahead

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

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

0
osgx

я использую find/-name stringofrandomcharacter, это очень помогает

0
user50472