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

74

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

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

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

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

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

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

Есть идеи?

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

  • Нашел это очень информативным: Linux Page Cache и pdflush
  • Как указал Зан, память на самом деле не свободна. Я имею в виду, что он не используется приложениями, и я хочу контролировать, что должно кэшироваться в памяти.
Andrioid
источник
1
Я тоже ищу что-то подобное. Я не думаю, что общее кеширование дисковых блоков файловой системы является ответом. Предположим, я хочу, чтобы дисковый блок X всегда кэшировался. К нему что-то обращается, и ядро ​​его кеширует. Пока все хорошо, но следующий процесс хочет блок Y, поэтому ядро ​​отбрасывает мой блок X и вместо этого кэширует Y. Следующий процесс, который хочет, чтобы X должен был ждать, пока он сойдет с диска; это то, чего я хочу избежать. То, что я хотел бы (и я думаю, что оригинальный постер после этого тоже), это наложить сквозной кэш сквозной записи на файловую систему, которая будет гарантировать, что файлы всегда
1
Учитывая, что, по-видимому, все согласны с тем, что Linux уже должен кэшировать часто используемые файлы для вас, мне интересно, удалось ли вам на самом деле внести какие-либо улучшения, используя приведенные здесь советы. Мне кажется, что попытка ручного управления кэшированием может быть полезна для разогрева кэша, но при описанной вами схеме использования («обслуживание одних и тех же файлов весь день») это не поможет уже прогретому серверу. много, если вообще.
Nate CK
Вы говорите, что не ищете взлома, но Linux уже делает то, что вы хотите сделать по умолчанию. Следующее уравнение: «обслуживать одни и те же файлы весь день» + «указывать файловой системе всегда обслуживать определенные файлы из ОЗУ» по определению равно «взломать». Вы заметили какие-либо улучшения производительности? По моему опыту, Linux-кеш - это чудо из вашей файловой системы.
Майк С
2
Для пояснения, Linux выполняет кеширование файлов, но метаданные проверяются для каждого файла для каждого запроса. При вращающейся ржавчине, на загруженном веб-сервере с большим количеством маленьких файлов, это все еще может вызвать конфликт ввода-вывода и преждевременный износ дисков. Статическое содержимое и сценарии могут быть rsync в / dev / shm или монтироваться в tmpfs при запуске приложения. Я делал это в течение нескольких десятилетий, и мои диски не изнашиваются преждевременно. Кроме того, мои сайты гораздо лучше переносят тяжелую взрывную нагрузку. Это помогает во всем, от самого дорогого оборудования для предприятия до обычного оборудования.
Аарон

Ответы:

57

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

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

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

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

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

Example 5

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

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

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

ищущий
источник
5
Для будущих читателей попробуйте использовать репозиторий vmtouch git вместо того, чтобы следовать инструкциям на связанной странице. Таким образом, вы получаете make-файл и можете получать обновления.
случайно
Кажется, что есть ограничение на размер файла (4 ГБ). Есть ли другая альтернатива?
Аликс Аксель
Хорошо, вот мой фактический вариант использования: RPi1 со старой SD-картой, где-то где-то делают Stuff. Перед тем, как отправиться туда и заменить карту (и, возможно, блок питания), я хочу, чтобы операционная система осторожно касалась карты, желательно никогда. Кэш FS хорош, но вне моего контроля; / bin и / sbin уже включены в tmpfs, получение / home / user также имеет другие недостатки. vmtouchхорошо вписывается в эту нишу
Писквор
как vmtouch работает иначе, чем tmpfs?
Эдвард Торвальдс
26

Это также возможно с помощью vmtouch Virtual Memory 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
ewwhite
источник
3
это отличная утилита, которая делает именно то, что запрашивает OP. Если бы только он принял это как ответ.
laebshade
Вы знаете, работает ли это с ZFS?
CMCDragonkai
1
@CMCDragonkai Я не думаю, что это необходимо с ZFS ... Подумайте: ARC и L2ARC .
ewwhite
22

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

cagenut
источник
1
Согласен. И если вы хотите, чтобы определенные файлы кэшировались, сделайте задание cron, которое catпериодически отправляет файл в / dev / null
Джош
18

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

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

 # mount -t ramfs ram /mnt/ram 

или же

 # mount -t tmpfs tmp /mnt/tmp

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

Дэвид Пашли
источник
1
Спасибо за ваш ответ, но это, очевидно, то, чего я хочу избежать. В противном случае я просто написал бы сценарий так, чтобы компьютер создавал ramdrive, копировал файлы и символически связывался с ramdrive. Но тогда мои данные противоречивы. Я надеялся на файловую систему, в которой я смогу «пометить» определенные файлы для кэширования в памяти. Но, может быть, я слишком оптимистичен.
Андриоид
3
Вы «помечаете» файлы для кэширования, обращаясь к ним.
womble
9
Если бы был какой-то способ автоматически пометить наиболее часто используемые файлы.
Дэвид Пашли
4
Блими, сарказм плохо путешествует, не так ли :)
Дэвид Пашли
2
Да спасибо. Я понимаю концепцию кэширования ввода-вывода. Я даже объяснил это в своем ответе. Кажется, вы не читали тонкий комментарий, что это был сарказм.
Дэвид Пашли
18

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

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

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

Andrioid
источник
1
Я подумал, что где-то есть программа для этого. +1
Брэд Гилберт
7

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

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), ядро ​​перемещает все, что ему не нужно, и освобождает ОЗУ для кэширования файлов. И, установив vfs_cache_pressureниже (скажем, 50, а не 0!), Он будет отдавать предпочтение кэшированию файлов вместо хранения данных приложения в оперативной памяти.

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

Петр Пудлак
источник
3

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

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

Зан Рысь
источник
Да, я просто хочу контролировать то, что кешируется.
Андриоид
3

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

Турбьерн Равн Андерсен
источник
3

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

Брэд Гилберт
источник
3
Насколько я могу судить, именно это делает fadvise (fcoretools).
Андриоид
0

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

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

Дэниел Лоусон
источник
0

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

sybreon
источник
0

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

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

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

Кайл Брандт
источник
1
найти / var / lib / mysql | xargs fadvise -willneed (грязно, но должно обеспечивать более быстрый доступ к файлам базы данных; в качестве примера)
Andrioid
Очень хороший хак, но такой хак не отключает много ожидающих fsyncs от mysql :( fsyncs необходимы для обеспечения ACID (атомарность, согласованность, изоляция, долговечность).
osgx
0

Настольные компьютеры (например, Ubuntu) уже используют предварительную загрузку файлов (по крайней мере, популярных общих библиотек) в память при загрузке. Он используется для ускорения загрузки и запуска различных вредоносных программ, таких как 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

osgx
источник
0

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

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

Джастин
источник
0

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

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


источник
0

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

user50472
источник
0

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

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

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

Federico
источник
-1

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

находить . -exec cp {} / dev / null \;

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

Highstaker
источник