Навіщо використовувати swap, коли в оперативній пам’яті більше ніж достатньо вільного місця?


124

Використання місця заміни оперативної пам'яті може різко уповільнити роботу ПК.

Так чому, коли у мене є більш ніж достатня кількість оперативної пам’яті, моя система Linux (Arch) використовує своп?

Описати мій витівковий результат нижче:

конічний вихід

Також, чи може це бути причиною проблем, пов'язаних зі швидкістю та реагуванням на систему?

Вихід free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

5
Я впевнений, що динаміка цього питання значно змінилася, коли SSD-диски стали нормою. У той час як ваш звичайний споживчий SSD все ще набагато повільніше, ніж оперативна пам’ять, тепер справа в тому, що дешевше - RAM $ / GB або SSD $ / GB. SSD, хоча повільніше, набагато дешевший і в більшості випадків досить швидкий, тому навіть обмін не повинен суттєво порушувати користувацький досвід, як це було раніше, з ротаційними носіями.
lkraav

7
Іноді, якщо ви використовували своп в минулому з - за повної оперативної пам'яті, ви можете мати ситуацію , в якій раніше переплутані дані залишитися там , тому що він не КОРИСНІ дані на даний момент.
Тотор

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

Відповіді:


93

Для систем Linux нормально використовувати деякий своп, навіть якщо все ще є оперативна пам'ять. Ядро Linux переміститься для обміну сторінками пам'яті, які дуже рідко використовуються (наприклад, gettyвипадки, коли ви використовуєте лише X11 та деякі інші неактивні демон).

Використання простору заміни стає проблемою лише тоді, коли не вистачає оперативної пам’яті, і ядро ​​змушене постійно переміщувати сторінки пам'яті для обміну та повернення до оперативної пам’яті, просто для того, щоб додатки не працювали. У цьому випадку програми системного монітора демонстрували б велику активність вводу / виводу диска.

Для порівняння, моя система Ubuntu 10.04 з двома користувачами, які увійшли в систему з сеансами X11, на яких працює робочий стіл GNOME, використовує ~ 600 Мб свопу та ~ 1 ГБ оперативної пам’яті (не рахуючи буфери та кеш-пам'ять), тому я б сказав, що ваші цифри для swap використання виглядають нормально.


39
Замінюючи неактивні програми, ви маєте більше пам'яті для кешування файлів. І це прискорює справи.
jmanning2k

91

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

/proc/sys/vm/swappiness

Значення за замовчуванням - 60. Якщо встановити значення 0, це ніколи не використовувати своп, коли залишилася оперативна пам'ять, а 100 - якнайшвидше.

Щоб тимчасово змінити значення (втрачено при перезавантаженні):

sudo sysctl vm.swappiness=10

Щоб остаточно змінити значення, відредагуйте файл:

/etc/sysctl.conf

як root (наприклад sudo nano /etc/sysctl.conf) та змінити або додати (якщо його немає) рядок:

vm.swappiness

до потрібного значення. Якщо цього файлу не існує (наприклад, в Arch Linux), спробуйте /etc/sysctl.d/99-sysctl.confнатомість.

Були певні дискусії щодо того, добре чи погано проводити заміну вільної пам’яті, але допомога Ubuntu дійсно рекомендує для систем настільних ПК значення 10 . Дивіться також цей підручник з Digital Ocean для CentOS .


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

Чи зберігається це протягом перезавантаження? Я думав / proc відновлював кожне завантаження.
HandyGandy

@HandyGandy: Я додав інформацію у відповідь, як її назавжди змінити.
Марсель Стімберг

@HandyGandy: щоб бути педантичним, / proc не регенерується на кожному завантаженні, а, скоріше, Pro є віртуальною файловою системою, тому вона "генерується" лише тоді, коли ви отримуєте доступ до них. Він взагалі не існує на диску.
Лі Лі Райан

swappinessЗначення не впливає на мою систему. Навіть встановивши його на 0, буде продовжуватися переміщення важливих і часто використовуваних сторінок (наприклад, індекс мого IDE) для обміну, коли є ще 2 ГБ вільного барана.
чефарів

46

Linux починає мінятися до заповнення оперативної пам’яті. Це робиться для підвищення продуктивності та чуйності:

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

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

Зміна, звичайно, сповільнює роботу системи, але альтернатива заміні не є заміною, вона має більше оперативної пам’яті або менше оперативної пам’яті.


Отже, в певному сенсі своп - це випадок міри? Це, і спляча річ?
tshepang

@Tshepang: Достатня кількість підкачки для встановлення віртуальної пам’яті не є «на випадок», це необхідно (інакше ваші програми вийдуть з ладу через брак пам’яті).
Жиль

1
@Tschepang: Вбивця OOM є причиною їх аварії. (Технічно ви можете обійтися без вбивці OOM, і просто не зможете виділити що-небудь, але це матиме хороші шанси заблокувати систему; вбивця OOM дозволяє трохи більше шансів, щоб адміністратор зміг увійти та для важливих процесів, щоб продовжувати працювати.)
Жил

1
Я розумію, що ви "міняєте сторінки, коли система працює в режимі очікування, а не коли пам'ять заповнена", але хлопець ледве використовує 15% своєї оперативної пам'яті. Далеко не майже повно, чи не так? Хоча попередня заміна, викликана повною оперативною пам’яттю, могла
піти з

1
"Linux починає мінятися до заповнення оперативної пам'яті", коли? саме
Yousha Aleayoub

11

Це старий пост, однак я все-таки мав би сміливо викладати свої думки тут.

Починаючи знизу, Linux спочатку розділив би пам'ять на сторінки (зазвичай 4K на сторінку в системі x86_64). Після цього створюється віртуальна пам'ять, відображення якої здійснюється за допомогою фізичної пам'яті за допомогою MMU (Unit Management Memory Unit).

Процеси розподіляються пам'яттю з області віртуальної пам'яті, тому, зверніть увагу, коли ви бачите / proc / meminfo, ви побачите VMalloc * як деталі віртуальної пам'яті.

Скажімо, у вас є процес, який вимагає пам'яті (скажімо, 300 Мб - веб-браузер). На процес буде виділено 300 МБ з віртуальної пам'яті, однак, це не обов'язково, це пам'ять відображена (тобто відображена у фізичну пам'ять). Існує концепція "Копіювати на запис" для управління пам'яттю, згідно з якою, якщо ваші процеси фактично використовують пам'ять, виділену з віртуальної пам'яті (тобто це робить деякий запис у пам'яті), то лише тоді вона відображається у фізичну пам'ять. Це допомагає ядру ефективно працювати в багатопроцесорному середовищі.

Що таке кеш?

Багато пам'яті, що використовується процесами, є спільним. Скажімо, бібліотека glibc використовується майже у всіх процесах. Який сенс зберігати в пам’яті кілька копій glibc, коли кожен процес може отримати доступ до одного місця пам’яті та зробити свою роботу. Такі часто використовувані ресурси зберігаються в кеші, щоб, коли процеси вимагають, на них можна було б посилатися на одне місце пам’яті. Це допомагає прискорити процеси, оскільки читання glibc (тощо) знову і знову з диска забирає багато часу.

Сказане було сказано для бібліотек, що використовуються спільно, подібне також стосується читання файлів. Якщо ви прочитаєте великий файл (скажімо, 100-200MB) вперше, це займе багато часу. Однак, коли ви спробуєте зробити те ж саме, прочитайте ще раз, це було б швидше. Дані були кешовані в пам'яті, і повторне читання було зроблено не для всіх блоків.

Що таке буфер?

Що стосується буфера, то коли процес робить файл вводу / виводу, він покладається на буфер ядра для запису даних на диск. Обробляє, запитує ядро ​​виконати роботу. Отже, від імені процесу ядро ​​записує дані у свій "буфер" і повідомляє процесу, що запис робиться. Таким чином, ядро ​​буде тримати синхронізацію цих даних у буфері на диску. Таким чином, процеси покладаються на ядро, щоб вибрати правильний час для синхронізації даних на диску, і процеси можуть продовжувати працювати вперед. Пам'ятайте, що це звичайні введення-виведення, які нормальні процеси роблять. Однак спеціалізовані процеси, які потребують підтвердження того, що введення-виведення насправді робиться на диску, можуть використовувати інший механізм для вводу-виводу на диску. Деякі утиліти з відкритим кодом - libaio. Також існують способи виклику явної синхронізації з FD, відкритими в контексті ваших процесів,

Які тоді несправності сторінки?

Розглянемо приклад, коли ви запускаєте процес (скажімо, веб-браузер), двійковий код якого становить близько 300 Мб. Однак повний 300 Мб двійкового веб-браузера не працює миттєво. Процес продовжує переходити від функцій до функцій у своєму коді. Як було сказано раніше, віртуальна пам'ять споживає 300 Мб, проте не все є пам'яттю, відображеною на фізичну пам'ять (RSS - пам'ять резидента буде менше, див. Верхній вихід). Коли виконання коду досягне точки, для якої пам'ять насправді не відображається фізично, виникне помилка сторінки. Ядро буде відображати цю пам'ять у фізичну, пов’язувати сторінку пам'яті з вашим процесом. Така помилка сторінки називається "Незначні помилки сторінки". Аналогічно, коли процес виконує файли, виникають помилки основних сторінок вводу / виводу.

Коли і чому відбувається Swap Out?

Ситуація 1:

Враховуючи деталі, наведені вище, давайте розглянемо сценарій, коли хороший об'єм пам'яті стане відображеним у пам'яті. А зараз запускаються процеси, для яких потрібна пам'ять. Як обговорювалося вище, ядро ​​доведеться зробити деяке відображення пам'яті. Однак для картографування пам’яті недостатньо фізичної оперативної пам’яті. Тепер ядро ​​спочатку загляне в кеш, воно матиме старі сторінки пам'яті, які не використовуються. Він перенесе ці сторінки на окремий розділ (званий SWAP), звільнить деякі сторінки та відобразить звільнені сторінки до нового запиту, що надходить. Оскільки запис на диску відбувається набагато повільніше, ніж твердотільна ОЗУ, цей процес займає багато часу, а значить, спостерігається уповільнення.

Ситуація 2:

Скажімо, ви бачите багато вільної пам'яті, доступної в системі. Вже тоді ви бачите, що відбувається багато замінів. Можлива проблема фрагментації пам'яті. Розглянемо процеси, які вимагають 50 МБ суміжної пам'яті з ядра. (майте на увазі суміжні). Очевидно, ядро ​​виділяло б сторінки випадковим чином різним процесам і звільнило деякі з них. Однак, коли ми вимагаємо суміжної пам’яті, їй доведеться шукати шматок, який задовольняє попит процесів. Якщо вона не в змозі отримати таку пам’ять, доведеться зробити заміну деяких старих сторінок пам'яті, а потім виділити суміжні. Навіть у таких випадках SWAP вийде. Починаючи з ядра версії 2.6 і вище, такі проблеми з фрагментацією значно зменшилися. Однак якщо система працює тривалий час, такі проблеми все-таки можуть виникнути.

Дивіться цей приклад ( вихід vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04 ми бачимо, що є ще хороша кількість безкоштовної оперативної пам’яті. Однак навіть тоді відбувся своп. У цей момент ми перевірили дерево процесів, і не побачили жодного процесу, який вимагав би такого великого обсягу пам'яті (більше, ніж вільної пам'яті). Очевидною підозрою була ситуація 2, описана вище. Ми перевірили журнали buddyinfo та zoneinfo вище (Використовуйте echo m> / proc / sysrq-тригер, щоб перевірити їх, вихід надходить у syslogs).

Для звичайної нашої системи порівняння інформації про зону іде так. А графіки для кешу / вільного / низького пам’яті також згадуються нижче

інформація про зону

своп безкоштовно низький вільний

Переглядаючи інформацію, зрозуміло, що у вузлі 0 та вузлі 1 нормально є фрагментація пам'яті (Вузол - це машина на базі NUMA, отже, декілька вузлів (див. Numactl для перевірки інформації для вашої системи).

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


2
Ви повинні уточнити, якщо у вашій "ситуації 2" складний процес виділення фізичної пам'яті, що є незвичним випадком. Більшість процесів мають справу лише з віртуальною пам'яттю, де фрагментація майже не має значення. Можливо, ви також хочете краще пояснити, як ви стверджуєте, що існує фрагментація пам’яті з цифр та діаграми, що відображаються, оскільки це не очевидно на перший погляд. О, і, до речі, ви насправді говорите про суміжну пам’ять, сподіваємось, не заразну пам’ять ;-)
jlliagre

@jlliagre: Дякую за вклад. Я редагую "суміжну" помилку.
Ануграха Сінга

5

Маючи більше доступної пам’яті

Як усі казали, так "swap" допоможе вам позбутися невикористаної пам'яті, тому це може допомогти вам мати більше пам'яті.

Зимує

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

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

Короткі приїзди

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

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


3

Дуже багато сучасних програм побудовано на роздутих каркасах, які тягнуть у собі багато сміття, яке вам насправді не потрібно для запуску програми. Заміна цих невикористаних сторінок звільняє оперативну пам’ять для кешу та програм, які фактично можуть використовувати ОЗУ.

Я говорю тут із болючого особистого досвіду.

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

Але є і мінус: Firefox великий. Дійсно великий. Це був проект версії 1.x, тому вони не розібралися з такими речами, як видалення підтримки GUI. [*] Моєму сайту цього нічого не потрібно, але через те, що технологія VPS, яку використовував мій хостинг-провайдер, не робила цього ' не дозволяйте розміщувати місця, щоб GUI-код і всі інші частини Firefox не використовували реальну ОЗУ. Мені потрібно було мінімум 512 Мб оперативної пам’яті просто для запуску сайту без його збоїв через виснаження пам’яті. Якби мій VPS мав трохи місця для обміну, я, мабуть, міг би отримати план з 256 Мб.

[*] Видалення коду GUI з фреймворку може навіть не бути бажаним, оскільки однією з переваг цієї платформи було високоточне скребкування веб-сторінок, оскільки рамка серверної сторони могла завантажувати веб-сторінки з іншого сайту, а ви можете ними маніпулювати. так само, як і на стороні клієнта. Подумайте про маскування. Багато подібного може зламатися, якщо ви не зможете "перетворити" веб-сторінку в якийсь графічний контекст.

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


3

Від Ubuntu Обміну FAQ , що Марсель пов'язаний з

В якості базового мінімуму настійно рекомендується, щоб місце підкачки було рівним обсягу фізичної пам'яті (ОЗП). Крім того, рекомендується, щоб місце для заміни було вдвічі більшим за об'єм фізичної пам'яті (RAM) залежно від обсягу жорсткого диска

Я думаю, ви повинні збільшити свій обмінний простір у вашій системі. Заміна прискорює розподіл пам’яті оперативної пам’яті, дозволяючи відкинути вже підключені дані.


6
Я все ще вважаю це неймовірним. Навіщо мені потрібно 8 Гб свопу для моєї 4 Гб, ніколи не сплячої системи? Чи дійсно мені потрібно 128 Гб свопу для мого обчислювального вузла 64 Гб? Зазвичай я виділяю не більше 1 Гб на своп, якщо немає високоспецифічної причини.
Девід Макінтош

2
Це залишає більше місця для кешування повільного жорсткого диска у блискавичній оперативній пам'яті. (Плюс деякі схеми сплячки зберігають копію оперативної пам’яті в
просторі

6
@David, @Jader: Фігура swap = 2 * барана - це старий каштан, який добре вижив після того, як оригінальне виправдання стало неактуальним - тепер люди намагаються знайти спосіб виправдати цю цифру, а не придумувати відповідну цифру для своєї системи . Подивіться, чому нам потрібно встановити простір підкачки в два рази більше, ніж наша фізична пам'ять? .
Жиль

1
@Gilles Я дотримуюся своєї позиції, тому що я побачив одного разу авторитетний документ на цю тему, який суперечить купі експертів, що я не знаю, наскільки глибокі їхні знання.
Jader Dias

4
Якщо ви можете згадати посилання, будь ласка, поділіться.
Жиль

2

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

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