Чи можу я налаштувати свою систему Linux для більш агресивного кешування файлової системи?


119

Мене не хвилює використання оперативної пам’яті (як я отримав достатньо), ні втрата даних у разі випадкового відключення (оскільки підтримується моя потужність, система є надійною і дані не є критичними). Але я дуже багато оброблюю файли і можу використовувати деяке підвищення продуктивності.

Ось чому я хотів би налаштувати систему на використання більшої кількості оперативної пам’яті для кешування і запису кешування файлів, попереднього вибору файлів агресивно (наприклад, заздалегідь прочитайте весь файл, до якого звертається програма, якщо файл має розмір розумного або принаймні читати заздалегідь великий фрагмент цього в іншому випадку) і рідше стирати буфери для запису. Як цього досягти (можливо, це можливо)?

Я використовую файлові системи ext3 та ntfs (я багато використовую ntfs!) З XUbuntu 11.10 x86.


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

1
@Nils, комп'ютер - це ноутбук, тому, я вважаю, контролер досить звичайний.
Іван

1
Один із способів значно покращити продуктивність - пропустити довговічність даних. Просто відключіть синхронізацію на диску, навіть якщо деякі програми вимагають синхронізації. Це призведе до втрати даних, якщо ваш пристрій зберігання коли-небудь зазнає втрати електроенергії. Якщо ви хочете це зробити так чи інакше, просто виконайте sudo mount -o ro,nobarrier /path/to/mountpointабо налаштуйте, /etc/fstabщоб включити nobarrierбудь-яку файлову систему, яку ви готові пожертвувати для покращення продуктивності. Однак якщо на вашому пристрої зберігання є внутрішній акумулятор, такий як Intel 320 SSD серія, використання nobarrierне призводить до втрати даних.
Мікко Ранталайнен

1
Використання нобар'єру більше не рекомендується в Red Hat Enterprise Linux 6, оскільки негативний вплив бар'єрів на запитання є незначним (приблизно 3%). Переваги бар'єрів для запису зазвичай переважають за ефективність від їх відключення. Крім того, опція nobarrier ніколи не повинна використовуватися на сховищі, налаштованому на віртуальних машинах. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Івайло Бардаров

1
Два бали - 1) Існують Linux-дистрибутиви на основі Debian або Ubuntu, як Puppy Linux і AntiX Linux, та багато інших, які ставлять усю операційну систему в шаруваті розділи рамбіска (тобто AUFS або overlayfs) і керують нею прозоро. Дуже швидко! - 2) Ми розкрили в реальному дизайні дуже великої системи, що кидання на неї більше кешу може знизити ВИКОНАННЯ. Зі збільшенням швидкості зберігання (тобто SSD), необхідний необхідний розмір кешу зменшується. Неможливо дізнатися, що таке розмір, не експериментуючи на вашій конкретній системі. Якщо збільшення не працює, спробуйте зменшити його.
DocSalvager

Відповіді:


107

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

Ви не сказали, чи ваш пристрій зберігання даних - це SSD або HDD. Ось що я знайшов роботу для мене (в моєму випадку sdaце HDD , встановлений на /homeі sdbє SSD встановлений на /).

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

Ось моя установка для жорсткого диска (переконайтеся, що AHCI + NCQ увімкнено в BIOS, якщо у вас є перемикачі):

echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda

Варто зауважити, що для корпусу жорсткого диска є високий fifo_expire_async(як правило, запис) і тривалий, slice_syncщоб дозволити одному процесу отримати високу пропускну здатність (встановити slice_syncна нижчу кількість, якщо ви потрапляєте в ситуації, коли кілька процесів чекають паралельно деяких даних з диска). Це slice_idleзавжди є компромісом для жорстких дисків, але встановлення його десь у діапазоні 3-20 повинно бути нормальним залежно від використання диска та мікропрограмного забезпечення диска. Я вважаю за краще орієнтуватися на низькі значення, але встановлення його занадто низьке знищить вашу пропускну здатність. quantumУстановка , здається, впливає на пропускну здатність багато , але спробувати зберегти це якомога менше , щоб зберегти час очікування на розумному рівні. Якщо quantumзанадто низька установка знищить пропускну здатність. Значення в діапазоні 3-8, здається, добре працюють із жорсткими дисками. Найгірший час затримки для читання - ( quantum* slice_sync) + ( slice_async_rq*slice_async) ms, якщо я правильно зрозумів поведінку ядра. Асинхроніка в основному використовується при записі, і оскільки ви готові затримати запис на диску, встановіть як slice_async_rqі slice_asyncдуже низькі числа. Однак встановлення slice_async_rqзанадто низького значення може зупинити зчитування, оскільки запис вже не може затягуватися після читання. Мій конфігуратор спробує записати дані на диск максимум через 10 секунд після передачі даних в ядро, але оскільки ви можете терпіти втрату даних про втрату потужності, також встановлено, fifo_expire_asyncщо 3600000потрібно сказати, що 1 годину в порядку для затримки на диску. slice_asyncОднак просто тримайте низький рівень, тому що в іншому випадку ви можете отримати високу затримку читання.

hdparmКоманда необхідна для запобігання AAM від вбивства здебільшого продуктивності , що дозволяє AHCI + NCQ. Якщо ваш диск видає занадто багато шуму, пропустіть це.

Ось моя настройка для SSD (Intel 320 серія):

echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync

Тут варто відзначити низькі значення для різних параметрів зрізу. Найважливіший параметр для SSD - slice_idleце встановити значення 0-1. Якщо встановити його на нуль, всі рішення про впорядкування переміщуються до рідного NCQ, встановивши його в 1, ядро ​​дозволяє замовляти запити (але якщо NCQ активний, апаратне забезпечення може частково змінювати впорядкування ядра). Перевірте обидва значення, щоб побачити, чи можете ви бачити різницю. Для Intel серії 320, це здається , що установка slide_idleна 0дає найкращу продуктивність , але установка його 1дає кращий ( самий низький) загальне час очікування.

Для отримання додаткової інформації про ці налаштування див. Http://www.linux-mag.com/id/7572/ .

Тепер, коли ми налаштували ядро ​​для завантаження матеріалів з диска в кеш з розумною продуктивністю, настав час коригувати поведінку кешу:

Відповідно до тестів, які я зробив, я взагалі не переймався б налаштуванням читання вперед blockdev. Налаштування ядра за замовчуванням добре.

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

echo 15 > /proc/sys/vm/swappiness

Якщо ви віддаєте перевагу майже завжди зберігати програми в оперативній пам’яті, ви можете встановити це значення 1. Якщо ви встановите це на нуль, ядро ​​взагалі не буде міняти місцями, якщо це абсолютно не потрібно, щоб уникнути OOM. Якщо у вас обмежена пам'ять і ви працюєте з великими файлами (наприклад, редагування HD-відео), можливо, було б доцільно встановити це значення близько 100.

У наш час (2017) я вважаю за краще взагалі не робити своп, якщо у вас достатньо оперативної пам’яті. Якщо не здійснювати заміну, зазвичай ви втратите 200-1000 МБ оперативної пам’яті на довго працюючих настільних машинах. Я готовий пожертвувати таким чином, щоб уникнути затримки найгіршого випадку (заміни коду програми, коли оперативна пам'ять заповнена). На практиці це означає, що я віддаю перевагу OOM Killer перед свопом. Якщо ви дозволяєте / потребуєте заміни, ви можете також збільшити /proc/sys/vm/watermark_scale_factor, щоб уникнути затримок. Я б запропонував значення між 100 і 500. Ви можете розглянути цей параметр як торгівлю процесором для зниження затримки своп. За замовчуванням - 10, а максимально можливе - 1000. Більше значення повинно (відповідно до документації на ядро ) призводити до більшого використання процесора для kswapdпроцесів та зниження загальної затримки заміни.

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

echo 10 > /proc/sys/vm/vfs_cache_pressure

Налаштування vfs_cache_pressureмале значення має сенс, оскільки в більшості випадків ядро ​​має знати структуру каталогів, перш ніж воно зможе використовувати вміст файлу з кешу, а занадто рано промивання кешу каталогу зробить кеш файлу поруч з непридатним. Якщо ви маєте багато невеликих файлів (у моїй системі є близько 150 Кб 10-мегапіксельних фотографій і вважається системою "безліч малих файлів") до 1-го рівня. Ніколи не встановлюйте його на нуль, або структура каталогу завжди зберігається в пам'яті, навіть якщо в системі не вистачає пам'яті. Встановити велике значення доцільно, лише якщо у вас є лише кілька великих файлів, які постійно перечитуються (знову ж таки, редагування HD відео без достатньої кількості оперативної пам’яті було б прикладом). Офіційна документація на ядро ​​говорить, що "

Виняток: якщо у вас справді величезна кількість файлів і каталогів, і ви рідко торкаєтесь / читаєте / перелічуєте всі файли, налаштування яких vfs_cache_pressureперевищує 100, може бути розумним. Це стосується лише якщо у вас недостатньо оперативної пам’яті та не вдається зберегти всю структуру каталогів в оперативній пам’яті та все ще маєте достатню кількість оперативної пам’яті для нормального кешування файлів та процесів (наприклад, загальнофірмовий файловий сервер з великою кількістю архівного вмісту). Якщо ви вважаєте, що вам потрібно збільшити vfs_cache_pressureпонад 100, ви працюєте без достатньої оперативної пам’яті. Збільшення vfs_cache_pressureможе допомогти, але єдине справжнє виправлення - отримати більше оперативної пам’яті. Встановивши vfs_cache_pressureвисоку кількість жертв середньої продуктивності за стабільнішу ефективність в цілому (тобто ви можете уникнути дійсно поганої поведінки в гіршому випадку, але доведеться мати справу з гіршими загальними показниками).

Нарешті, скажіть ядро ​​використовувати до 99% оперативної пам’яті як кеш для запису, і доручіть ядру використовувати до 50% оперативної пам’яті, перш ніж уповільнити процес написання (за замовчуванням dirty_background_ratioє 10). Попередження: Я особисто цього не зробив би, але ви стверджували, що маєте достатню кількість оперативної пам’яті і готові втратити дані.

echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio

І скажіть, що затримка запису на 1 год нормальна, щоб навіть почати писати речі на диск (знову ж, я б цього не робив):

echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs

Якщо ви поставите все це до /etc/rc.localі включите наступне в кінці, все буде в кеші якнайшвидше після завантаження (зробіть це лише в тому випадку, якщо ваша файлова система дійсно вписується в ОЗУ):

(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&

Або трохи простіша альтернатива, яка може працювати краще (кеш-пам’яті /homeта /usr, робити це лише у тому випадку, якщо ваш /homeі /usrсправді вписується в оперативну пам’ять):

(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&

3
Добре поінформована і загалом набагато краща відповідь, ніж прийнята! Цей недооцінений ... Я думаю, більшість людей просто хочуть простих інструкцій, не турбуючись, щоб зрозуміти, що вони насправді роблять ...
Володимир Пантелеев

2
@Phpdevpad: Крім того, у запитанні було сказано: "Я не турбуюся щодо використання оперативної пам'яті [...]" - я не думаю, що будь-який пристрій Maemo може кваліфікувати.
Мікко Ранталайнен

1
Хіба Noop або термін не є кращим планувальником для SSD?
rep_movsd

1
@rep_movsd Я використовував тільки SSD-накопичувачі Intel, але принаймні ці диски все ще досить повільні, щоб мати кращу загальну продуктивність з більш розумними планувальниками, такими як CFQ. Я б здогадався, що якщо ваш SSD накопичувач може працювати з більш ніж 100 К випадковими IOPS, використання noop або терміну буде сенс навіть у швидкому процесорі. Під "швидким процесором" я маю на увазі те, що має принаймні кілька ядер 3 ГГц, доступних лише для IO.
Мікко Ранталайнен

1
Ви також можете прочитати про ці вмикачі vm з документів ядра vm .
joeytwiddle

16

По-перше, я НЕ рекомендую продовжувати використовувати NTFS, оскільки реалізація ntfs в Linux буде проблемою з продуктивністю та безпекою в будь-який час.

Можна зробити кілька речей:

  • використовувати новіші fs, такі як ext4абоbtrfs
  • спробуйте змінити, наприклад, свій планувальник io bfq
  • вимкнути своп
  • використовувати якийсь автоматичний попередній завантажувач preload
  • використовувати щось на кшталт systemdпопереднього завантаження під час завантаження
  • ... і щось більше

Можливо, ви хочете спробувати :-)


1
Я вже повністю відійшов від NTFS до ext4 один раз, залишивши єдиним розділом NTFS системний розділ Windows. Але це виявилося для мене багатьма незручностями, і я повернувся до NTFS як до основного розділу даних (де я зберігаю всі свої документи, завантаження, проекти, вихідний код тощо) файлову систему. Я не відмовляюся від переосмислення своєї структури розділів і мого робочого процесу (щоб використовувати менше Windows), але зараз відмова від NTFS не видається реалістичним варіантом.
Іван

Якщо вам також доведеться використовувати свої дані всередині Windows, NTFS може бути єдиним варіантом. (Є багато інших варіантів, якщо ви можете використовувати Windows як віртуальний комп'ютер всередині Linux)
Фелікс Ян

1
Підсумок того, що ці передбачувані проблеми є NTFS, було б корисним.
підкреслити_5

2
NTFS в Linux цілком прийнятний за винятком продуктивності. Враховуючи, що питання стосувалося конкретно покращення продуктивності файлової системи, NTFS має бути першим, що потрібно зробити.
Мікко Ранталайнен

Незважаючи на те btrfs, що файлова система нещодавно розроблена, я б уникну цього, якщо потрібна продуктивність. Ми експлуатуємо в іншому випадку ідентичних системи з btrfsі ext4файловими системами і ext4перемоги в реальному світі , з великим відривом ( btrfsздається, вимагає близько ого процесорного часу на ext4потреби того ж рівень продуктивності і викликає більше дискових операції для однієї логічної команди). Залежно від завантаженості, я б запропонував ext4, jfsабо xfsдля будь-якої роботи, що вимагає роботи.
Мікко Ранталайнен

8

Читайте наперед:

У 32-бітових системах:

blockdev --setra 8388607 /dev/sda

У 64-бітових системах:

blockdev --setra 4294967295 /dev/sda

Запишіть за кеш:

echo 100 > /proc/sys/vm/dirty_ratio

Це використовуватиме до 100% вашої вільної пам'яті як кеш запису.

Або ви можете все вийти та використовувати tmpfs. Це актуально лише в тому випадку, якщо у вас достатньо оперативної пам’яті. Покладіть це /etc/fstab. Замініть 100G на кількість фізичної оперативної пам’яті.

tmpfs /mnt/tmpfs tmpfs size=100G,rw,nosuid,nodev 0 0

Тоді:

mkdir /mnt/tmpfs; mount -a

Потім використовуйте / mnt / tmpfs.


5
3 Гб або 2 ТБ начитаний? справді? Ви навіть знаєте, що роблять ці варіанти?
Cobra_Fast

1
@Cobra_Fast Чи знаєте ви, що це означає? Я справді поняття не маю, і мені зараз цікаво.
syss

3
@syss параметри для читання головою зберігаються як кількість "блоків" пам'яті, а не байти чи біти. Розмір одного блоку визначається під час компіляції ядра (оскільки блоки "читання" - це блоки пам'яті) або час створення файлової системи в деяких випадках. Зазвичай 1 блок містить 512 або 4096 байт. Дивіться linux.die.net/man/8/blockdev
Cobra_Fast

6

Ви можете встановити розмір наперед читання за допомогою blockdev --setra sectors /dev/sda1, де сектори - це потрібний вам розмір у 512 байтових секторах.


2

Моя настройка вбивць дуже проста і дуже ефективна:

echo "2000" > /proc/sys/vm/vfs_cache_pressure

Пояснення з документації на ядро :

vfs_cache_pressure

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

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

vfs_cache_pressure в 2000 році призводить до того, що більша частина обчислень відбувається в оперативній пам'яті, і дуже пізно записується диск.


4
Якщо vfs_cache_pressureзанадто висока установка (я вважаю 2000занадто високою), це призведе до зайвого доступу до диска навіть для простих речей, таких як списки каталогів, які легко вписуються в кеш. Скільки оперативної пам’яті у вас і що ви робите з системою? Як я писав у своїй відповіді, використання високого значення для цього параметра має сенс, наприклад, для редагування HD відео з обмеженою оперативною пам’яттю.
Мікко Ранталайнен

2
Зауважте, що посилана документація продовжується: " Збільшення vfs_cache_pressure значно більше 100 може мати негативний вплив на продуктивність. Код відшкодування потрібно робити різні блокування, щоб знайти доступний каталог та об'єкти inode. З vfs_cache_pressure = 1000 він буде шукати в десять разів більше вільних об'єктів, ніж там є ».
Мікко Ранталайнен

1

Не стосується кешування записів, але пов’язане з записом:

  • Для системи ext4 ви можете повністю відключити журнал

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

Щоб зупинити читання диска від запуску запису диска:

  • Встановити з relatime або noatime варіант

    Коли ви читаєте файл, метадані для цього файлу, як правило, оновлюються останнім часом доступу. Цей noatimeпараметр вимкне цю поведінку. Це зменшує зайві записи на диск, але ви більше не матимете цих метаданих. Деякі дистрибутиви (наприклад, Manjaro) прийняли це за замовчуванням для всіх розділів (можливо, для збільшення терміну служби попередніх моделей SSD).

    relatimeоновлює час доступу рідше, згідно з евристикою, яка допомагає підтримувати додатки, які використовують atime. Це стандартний стандарт для Red Hat Enterprise Linux.

Інші варіанти:

  • У коментарях вище Мікко поділився можливістю кріплення з нобар'єрним варіантом. Але Івайло процитував RedHat, хто застерігає проти цього. Наскільки погано ти хочеш цих зайвих 3%?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.