Кешування / попереднє завантаження файлів з Linux в оперативну пам'ять


74

У мене досить старий сервер, який має 4 Гб оперативної пам’яті, і він майже весь день обслуговує одні і ті ж файли, але це робиться з жорсткого диска, тоді як 3 ГБ оперативної пам’яті «вільні».

Кожен, хто коли-небудь намагався запустити трамвайний привід, може засвідчити, що це дивовижно з точки зору швидкості. Використання пам'яті в цій системі зазвичай ніколи не перевищує 1 ГБ / 4 ГБ, тому я хочу знати, чи є спосіб використовувати цю додаткову пам'ять для чогось хорошого.

  • Чи можна сказати файловій системі завжди обслуговувати певні файли з оперативної пам’яті?
  • Чи є якісь інші методи, якими я можу скористатися для вдосконалення можливостей читання файлів за допомогою оперативної пам'яті?

Більш конкретно, я не шукаю тут "злому". Я хочу, щоб виклики файлової системи обслуговували файли з оперативної пам’яті без необхідності створювати оперативний диск і копіювати файли туди вручну. Або принаймні сценарій, який робить це для мене.

Тут можливі додатки:

  • Веб-сервери зі статичними файлами, які читають багато
  • Сервери додатків з великими бібліотеками
  • Настільні комп'ютери з занадто великою кількістю ОЗУ

Будь-які ідеї?

Редагувати:

  • Це виявилося дуже інформативним: Кеш сторінки та Linux pdflush
  • Як зазначив Зан, пам'ять насправді не вільна. Що я маю на увазі, що це не використовується програмами, і я хочу контролювати те, що має бути кешоване в пам'яті.

1
Я теж щось шукаю. Я не думаю, що загальне кешування блоків файлової системи є відповіддю. Припустимо, я хочу, щоб диск диска X завжди був кешований. Щось отримує доступ до нього, і ядро ​​кешує його. Поки що добре, але наступний процес хоче блок Y, тому ядро ​​відкидає мій блок X і кешує Y замість цього. Наступний процес, який хоче X, повинен буде почекати, поки він вийде з диска; саме цього я хочу уникати. Я б хотів (і те, що я думаю, що оригінальний плакат теж після) - це накладення кешу, що записує, на файлову систему, яка гарантує, що файли завжди є

1
Зважаючи на те, що, мабуть, існує думка про те, що Linux вже повинен кешувати часто використовувані файли для вас, мені цікаво, чи вам вдалося внести якісь покращення, використовуючи поради, знайдені тут. Мені здається, що намагання керувати кешуванням вручну може бути корисним для розігрівання кешу, але що з описаною схемою використання, яку ви описуєте ("обслуговуючи одні й ті самі файли цілий день"), це не допоможе вже прогрітому серверу багато, якщо взагалі.
Нейт СК

Ви кажете, що не шукаєте злому, але Linux вже робить те, що ви хочете зробити за замовчуванням. Наступне рівняння: "подання одних і тих же файлів цілий день" + "скажіть файловій системі завжди обслуговувати певні файли з оперативної пам'яті" дорівнює "Hack" за визначенням. Ви насправді помітили якісь покращення продуктивності? За моїм досвідом, кеш Linux виводить bejeezus з вашої файлової системи.
Майк S

2
Для уточнення, Linux робить кеш-файли, але метадані перевірені для кожного файлу для кожного запиту. На спінінг-іржі, на зайнятому веб-сервері з великою кількістю невеликих файлів, які все ще можуть викликати суперечки IO і передчасно зношувати диски. Статичний вміст та сценарії можуть бути rsync у / dev / shm або на власному монтажі tmpfs під час запуску програми. Я робив це протягом декількох десятиліть, і мої накопичувачі не зношуються передчасно. Крім того, мої сайти витримують сильне навантаження, яке набагато краще. Це допомагає у будь-якому, від найдорожчого обладнання для підприємства до товарного обладнання.
Аарон

Відповіді:


57

vmtouch здається хорошим інструментом для роботи.

Основні моменти:

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

vmtouch керівництво

РЕДАКТУВАННЯ: Використання, вказане у питанні, перелічено у прикладі 5 на домашній сторінці vmtouch

Example 5

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

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

EDIT2: Як зазначено в коментарях, зараз доступно сховище git .


5
Для майбутніх глядачів спробуйте використовувати сховище vmtouch git замість того, щоб дотримуватися інструкцій на пов’язаній сторінці. Таким чином ви отримуєте makefile і зможете витягувати оновлення.
випадково

Здається, існує обмеження розміру файлу (4 ГБ). Чи є інша альтернатива?
Алікс Аксель

Гаразд, ось мій фактичний випадок використання: RPi1 зі старою SD-карткою, там десь робляться речі. Перш ніж я можу здійснити поїздку туди і замінити карту (а можливо, і джерело живлення), я хочу, щоб ОС торкнулася картки помірно, бажано ніколи. Кеш FS хороший, але поза моїм контролем; / bin та / sbin вже розміщені на tmpfs, а також отримання дому / користувача також має інші недоліки. vmtouchдобре вписується в цю нішу.
Пісквор

як vmtouch працює інакше, ніж tmpfs?
Едвард Торвальдс

26

Це також можливо з допомогою vmtouch Virtual Memory Toucher утиліти .

Інструмент дозволяє керувати кешем файлової системи в системі Linux. Ви можете примусити або заблокувати певний файл або каталог в підсистемі кешу VM або використовувати його, щоб перевірити, які частини файлу / каталогу містяться в 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

3
це велика утиліта і робить саме те, що вимагала ОП Якби він прийняв це як відповідь.
в'язниця

Чи знаєте ви, чи працює це з ZFS?
CMCDragonkai

1
@CMCDragonkai Я не думаю, що це потрібно з ZFS ... Подумайте: ARC та L2ARC .
ewwhite

22

Хитрість бідолахи для отримання матеріалів у кеш файлової системи полягає в тому, щоб просто перевести її в коти і перенаправити на / dev / null.


1
Погодьтеся. І якщо ви хочете переконатися, що певні файли є кешованими, робіть cron завдання, яке буде catперіодично в / dev / null
Josh

18

Linux буде кешувати стільки дискових вводу-пам'яті, скільки можливо. Ось що таке статистика пам'яті кеша і буфера. Це, ймовірно, зробить кращу роботу, ніж ви, при зберіганні правильних речей.

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

 # mount -t ramfs ram /mnt/ram 

або

 # mount -t tmpfs tmp /mnt/tmp

а потім скопіюйте свої дані в каталог. Очевидно, що коли ви вимкнете апарат або відключите цей розділ, ваші дані будуть втрачені.


1
Дякую за вашу відповідь, але це, очевидно, я хочу уникати. В іншому випадку я просто скриптую його, щоб комп'ютер створив рамбову передачу, копіював файли і символічно посилався на ramdrive. Але тоді мої дані суперечать. Я сподівався на файлову систему, де я можу "тегнути" певні файли, щоб бути кешованими в пам'яті. Але, можливо, я трохи надто оптимістичний.
Андріоїд

3
Ви "тегуєте" файли, які потрібно кешувати, отримуючи доступ до них.
живіт

9
Якби тільки був спосіб автоматичного тегування найбільш часто використовуваних файлів.
Девід Пашлі

4
Blimey, сарказм не подорожує добре це робить :)
David Pashley

2
Так дякую. Я розумію концепцію кешування IO. Я навіть пояснив це у своїй відповіді. Здається, ви не читали тонкого коментаря, що це сарказм.
Девід Пашлі

18

Після деякого докладного ознайомлення з функціями перемикання ядра 2.6 та кешування сторінок я знайшов "fcoretools". Який складається з двох інструментів;

  • завершення: Виявить, скільки сторінок додаток зберігає в основній пам'яті
  • fadvise: Дозволяє маніпулювати ядром пам'яті (кеш сторінки).

(Якщо хтось інший виявить це цікавим, я публікую це тут)


1
Я подумав, що є програма, де це зробити десь. +1
Бред Гілберт

7

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

свавілля

повідомляє Linux Linux, як агресивно він повинен використовувати своп. Цитуючи статтю у Вікіпедії:

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

vfs_cache_pressure

Цитування з vm.txt :

Контролює схильність ядра до повернення пам'яті, яка використовується для кешування об'єктів каталогу та inode.

За значенням за замовчуванням vfs_cache_pressure = 100 ядро ​​намагатиметься відшкодувати зубні протези та індекси за "справедливою" швидкістю щодо відновлення сторінкового кешу та повернення swapcache. Зниження vfs_cache_pressure призводить до того, що ядро ​​вважає за краще зберігати кеш-пам'ять зубів та зубів. ...


Встановивши swappinessвисоку (як 100), ядро ​​переміщує все, що не потрібно міняти, звільняючи оперативну пам’ять для кешування файлів. І встановивши vfs_cache_pressureнижчу (скажімо, на 50, а не на 0!), Вона сприятиме кешування файлів, а не збереження даних програми в оперативній пам'яті.

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


3

Я дуже сумніваюся, що він фактично обслуговує файли з диска з 3 ГБ оперативної пам’яті. Кешування файлів Linux дуже добре.

Якщо ви бачите IO диска, я би вивчив ваші конфігурації журналу. Багато журналів встановлюються як незаблоковані, щоб гарантувати наявність найновішої інформації журналу у випадку збою. У системах, які повинні бути швидкими незалежно, використовуйте захищений журнал IO або використовуйте віддалений сервер журналу.


Право ви є, я просто хочу контролювати те, що кешується.
Андріоїд

3

Якщо у вас є багато пам'яті, ви можете просто прочитати файли, які ви хочете кешувати з кішкою або подібними. Потім Linux зробить хорошу роботу, щоб зберегти його.


3

Можливо, ви зможете мати програму, яка просто mmapзбирає ваші файли, а потім залишається запущеною.


3
Наскільки я знаю, це те, що робить "fadvise" (fcoretools).
Андріоїд

0

Існують різні системи ramfs, якими ви можете скористатися (наприклад, ramfs, tmpfs), але в цілому, якщо файли насправді читаються часто, вони сидять у кеші вашої файлової системи. Якщо ваш робочий набір файлів більший, ніж ваш безкоштовний оперативної пам’яті, файли будуть очищені від нього - але якщо ваш робочий набір більший, ніж ваш безкоштовний баран, ви не зможете вписати все це у рамковий диск.

Перевірте вихід команди "вільний" в оболонці - значення в останньому стовпчику під "Кешоване" - це кількість вашого вільного оперативної пам’яті, що використовується для кешу файлової системи.


0

Щодо останнього питання, переконайтеся, що ваша ОЗУ сидить на різних каналах пам'яті, щоб процесор міг отримувати дані паралельно.


0

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

Але ваше запитання має загальний характер, підсистема пам'яті Linux створена для забезпечення найкращого загального використання оперативної пам'яті. Якщо ви хочете орієнтуватися на певні типи продуктивності, подумайте про пошук у програмі / proc / sys / vm.

Пакет fcoretools цікавий, мене цікавлять будь-які статті про його застосування ... Це посилання розповідає про фактичні системні виклики, які використовуються в додатку.


1
знайти / var / lib / mysql | xargs fadvise -willneed (брудно, але це повинно забезпечити швидший доступ до файлів бази даних; як приклад)
Andrioid

Дуже хороший злом, але такий злом не відключає багато файлів, що очікують, від mysql :( fsyncs потрібні для забезпечення кислотних кислот (атомність, консистенція, ізоляція, міцність).
osgx

0

Настільні комп'ютери (наприклад, ubuntu) вже використовують попереднє завантаження файлів (принаймні, популярних спільних бібліотек) для пам'яті під час завантаження. Він використовується для прискорення завантаження та запуску різних програм, таких як FF, OO, KDE та GNOME (з еволюційною розсилкою).

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

Існує також відповідний syscall: readahead (2) http://linux.die.net/man/2/readahead

Також є проект попередньої завантаження демона: http://linux.die.net/man/8/preload



0

Я щойно спробував DD, якщо = / dev / yourrootpartition = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

це не дає мені контролю, якого ви хочете, але він, принаймні, намагається використовувати марну пам'ять


0

Я використовую find / -name stringofrandomcharacter, що допомагає багато


0

Не зовсім те, що просили, але я використовую

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

щоб запустити ініціалізацію файлів у томі AWS, створеному на момент знімка. Це більш цілеспрямовано, ніж офіційна рекомендація щодо використання DD, якщо ви просто хочете прочитати деякі файли.


-1

Іноді я, можливо, захочу кешувати файли у певній папці та її підпапках. Я просто заходжу в цю папку і виконую наступне:

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

І ці файли кешовані

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.