У меня довольно старый сервер с 4 ГБ RAM), и он почти весь день обслуживает одни и те же файлы, но делает это с жесткого диска, в то время как 3 ГБ RAM "бесплатно".
Любой, кто когда-либо пробовал использовать оперативную память, может засвидетельствовать, что это потрясающе с точки зрения скорости. Использование памяти этой системой обычно никогда не превышает 1 ГБ/4 ГБ, поэтому я хочу знать, есть ли способ использовать эту дополнительную память для чего-то хорошего.
Точнее, я не ищу здесь "взлом". Я хочу, чтобы вызовы файловой системы обслуживали файлы из RAM) без необходимости создавать оперативную память и копировать туда файлы вручную. Или, по крайней мере, скрипт, который делает это для меня.
Возможные приложения здесь:
Любые идеи?
Правка:
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-репозиторий .
Это также возможно с помощью утилиты 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
Хитрость бедного человека в том, чтобы загружать данные в кеш файловой системы - просто перехватить их и перенаправить в/dev/null.
Linux будет кэшировать столько памяти IO в памяти, сколько может. Это то, что представляет собой статистика кеша и буферной памяти. Вероятно, она лучше справится с задачей хранения правильных вещей.
Однако, если вы настаиваете на хранении ваших данных в памяти, вы можете создать флеш-накопитель, используя tmpfs или ramfs. Разница в том, что ramfs выделит всю запрошенную вами память, поскольку tmpfs будет использовать только ту память, которую использует ваше блочное устройство. Моя память немного ржавая, но вы должны уметь:
# mount -t ramfs ram /mnt/ram
или
# mount -t tmpfs tmp /mnt/tmp
а затем скопируйте ваши данные в каталог. Очевидно, что когда вы выключите или размонтируете этот раздел, ваши данные будут потеряны.
После тщательного изучения возможностей подкачки ядра 2.6 и кэширования страниц я нашел 'fcoretools'. Который состоит из двух инструментов;
(Если кому-то это покажется интересным, я размещу это здесь)
Существуют две настройки ядра, которые могут значительно помочь даже без использования других инструментов:
говорит ядру Linux, насколько агрессивно он должен использовать swap. Цитирую статью из Википедии:
Swappiness - это свойство ядра Linux, которое меняет баланс между выгрузкой оперативной памяти, а не удалением страниц из системного кеша страниц. Swappiness может быть установлен на значения от 0 до 100 включительно. Низкое значение означает, что ядро будет стараться избегать перестановки настолько, насколько это возможно, тогда как более высокое значение заставит ядро агрессивно пытаться использовать пространство подкачки. Значение по умолчанию равно 60, и для большинства настольных систем его установка на 100 может повлиять на общую производительность, тогда как его снижение (даже 0) может улучшить интерактивность (уменьшение задержки отклика).
Цитирование из 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) и очищал кэш диска, поэтому в следующий раз я Скомпилировал проект, все снова было прочитано с диска. Настроив эти два параметра, я смог сохранить исходные тексты и скомпилированный вывод в кэше в ОЗУ, что значительно ускоряет процесс.)
Я очень сомневаюсь, что он на самом деле обслуживает файлы с диска с 3 ГБ RAM бесплатно. Кэширование файлов Linux очень хорошо.
Если вы видите дисковый ввод-вывод, я бы посмотрел ваши настройки регистрации. Многие журналы устанавливаются как небуферизованные, чтобы гарантировать доступность самой последней информации журнала в случае сбоя. В системах, которые должны работать быстро, используйте буферизованный журнал IO или используйте удаленный сервер журналов).
Вы можете иметь программу, которая просто mmap
ss ваши файлы, а затем продолжает работать.
Если у вас достаточно памяти, вы можете просто читать файлы, которые вы хотите кэшировать с помощью cat или аналогичных файлов. Linux будет хорошо справляться с этой задачей.
http://www.coker.com.au/memlockd/ делает это
хотя вам это действительно не нужно, linux отлично справится с кэшированием файлов, которые вы используете самостоятельно.
Существуют различные системы ramfs, которые вы можете использовать (например, ramfs, tmpfs), но в целом, если файлы действительно часто читаются, они помещаются в кеш вашей файловой системы. Если ваш рабочий набор файлов больше, чем ваш свободный ОЗУ, то файлы будут удалены из него, но если ваш рабочий набор будет больше, чем ваш свободный ОЗУ, вы никак не сможете вписать все это в виртуальный диск.
Проверьте вывод команды "free" в командной консоли - значение в последнем столбце в разделе "Cached" показывает, сколько свободного памяти используется для кэша файловой системы.
Не совсем то, что спросили, но я использую
найти BASE_DIRECTORY -type f -exec cat {}>/dev/null \;
инициировать инициализацию файлов в томе AWS, созданном из моментального снимка. Это более сфокусировано, чем официальная рекомендация использовать dd, если вы просто хотите прочитать некоторые файлы.
Что касается вашего последнего вопроса, убедитесь, что ваш RAM находится на разных каналах памяти, чтобы процессор мог получать данные параллельно.
Я думаю, что это может быть лучше решено на уровне приложений. Например, для этого, вероятно, существуют специализированные веб-серверы, или вы можете рассмотреть mod_cache с Apache. Если у вас есть конкретная цель, например, более быстрое обслуживание веб-контента, то я думаю, что вы можете получить улучшения от такого рода вещей.
Но ваш вопрос носит общий характер, подсистема памяти Linux предназначена для обеспечения наилучшего общего использования оперативной памяти. Если вы хотите ориентироваться на определенные типы производительности, попробуйте поискать все в/proc/sys/vm.
Пакет fcoretools интересен, мне были бы интересны любые статьи о его приложении ... Эта ссылка рассказывает о реальных системных вызовах, используемых в приложении.
я только что попробовал dd, если =/dev/yourrootpartition =/dev/null\bs = 1Mcount = howmuchmemoryyouwanttofill
это не дает мне контроль, который вы хотите, но он по крайней мере пытается использовать потерянную память
Настольные компьютеры (например, 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
я использую find/-name stringofrandomcharacter, это очень помогает