Чи є своп анахронізмом?


43

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

Мій аргумент приблизно такий (якщо припустити відсутність глобальної зміни або подвійності налаштувань OOM):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

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

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

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

У будь-яких Unix-бородах є якісь вагомі причини, щоб тримати своп?

ОНОВЛЕННЯ відповідей та аналіз:

  • ПІДТВЕРДЖЕНО? - fork () вимагає стільки ж пам’яті для дочірнього процесу, як і батьківський

    Сучасний fork () - це копіювання на запис для дітей на POSIX (загалом), але спеціально для Linux та FreeBSD , і я припускаю OSX шляхом екстраполяції. Я вважаю цю частину анахронічного багажу, який перевозить своп.

    Цікаво, що ця стаття Solaris стверджує, що, хоча Solaris використовує функцію Copy-on-Write за допомогою fork (), вам слід мати принаймні 2x (!) Розмір батьківського процесу у вільній віртуальній пам’яті, щоб fork () не лаявся в середній. Хоча елемент Solaris дещо перекручує аргумент, що своп - це анахронізм - я думаю, що достатньо операційних систем правильно реалізувати CoW таким чином, що важливіше розвіяти міф, ніж позначати його як подальше обґрунтування свопу. З тих пір. Давайте дивитися правді в очі. На даний момент люди, які насправді використовують Solaris, ймовірно, просто хлопці Oracle. Без образи Соляріс!

  • ПІДТВЕРДЖЕНО - файли tmpfs / ramfs можуть переходити до swap як зручності, коли tmpfs / ramfs заповнюється

    Не використовуйте tmpfs / ramfs без обмежень! Завжди чітко визначайте кількість оперативної пам'яті, яку ви хочете використовувати tmpfs / ramfs.

  • ГРАФІЧНИЙ - Поміняйте трохи "про всяк випадок"

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

    Це може бути корисно в тих випадках, коли ви працюєте на робочому столі і маєте безліч випадкових речей, але навіть все-таки - якщо щось збивається, я вважаю за краще, щоб це OOM пожинало, ніж пірнати в swap-hell. Це тільки я.

  • ЗАГАЛЕНО! - На Solaris , обмін є важливим для кількох причин

    tmpfs - держави Кількість вільного простору, доступного tmpfs, залежить від кількості нерозподіленого простору підкачки в системі. Розмір файлової системи tmpfs збільшується, щоб вмістити файли, записані на неї, але є деякі властиві компроміси для великих користувачів tmpfs. Tmpfs ділиться ресурсами з сегментами даних та стеками виконуваних програм. На виконання дуже великих програм може вплинути, якщо файлові системи tmpfs близькі до максимально допустимого розміру. Tmpfs може безкоштовно виділяти всі, крім 4 МБ, місця для обміну місцями в системі.

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

    Я не впевнений, якщо це означає, що максимальна віртуальна карта, яку ви можете створити, - це ram + swap , або якщо ви все-таки можете зробити щось на зразок mmap () файлу, більший за ram, і покладатися на ледачу ініціалізацію mmap (). Поки ви Мабуть, може запустити Solaris в наші дні прекрасно без свопів, здається, що це менш привітно, ніж інші операційні системи POSIXy.

  • ЗАГАЛЕНО! Популярні інструменти для сплячки в Linux, схоже, покладаються на своп

    За замовчуванням TuxOnIce виглядає так, що він покладається на своп для сплячки, хоча існують і інші засоби. Однак, якщо ви не працюєте з полем сплячки, я все одно стоятиму за твердженням, що "swap є анакронічним для Linux"


У мене немає великої борода ООН * x (деякі волосся все-таки;), але мої 2 копійки полягають у тому, що наявність "трохи" свопу дасть вашій системі певну надійність. Як замість безпосередньо OOM, ви б пішли на своп, якщо трохи за ваші обмеження системи. Впевнений, якщо це дійсно подолає ваші обмеження системи, ваша система в кінцевому підсумку вийде з ладу / зупинить / нукерувати себе / що б там ні було, ви можете собі уявити. Тож даючи трохи мотузки, щоб пограти з ними;)
Оукі

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

@Jushua: Перезавантаження в пам'ять може бути не за замовчуванням або навіть можливим, залежно від операційної системи.
jlliagre

У мене є сервер NAS з 8 ГБ оперативної пам’яті, він буде працювати до 2 ВМ. Я не ставив своп. Якщо вона почне сильно міняти, то вона все одно мертва. Тож він прекрасно підтримує ваш аргумент. З іншого боку, я все ще використовую свій іржавий робочий стіл з обмеженим 1 Гб оперативної пам’яті, і там у мене є своп для обробки рідкої пам’яті. Це робить дещо повільніше, але допоможіть мені відкрити Firefox та інші програми одночасно.
Гюйгенс

Я вважаю, що тригери вбивці OOM занадто пізно, лише після того, як спорожніли всі кеші і система стала млявою. Щоб зробити свою систему спритною , я використовую раннюм або ноханг, щоб виконати ту саму роботу, але раніше! Можна використовувати з свопом або без нього.
joeytwiddle

Відповіді:


28

Не плутайте (the) swap (як область диска) і swap (як метод переміщення сторінок пам'яті з оперативної пам’яті на диск і взаємно).

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

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

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


1
Ви впевнені, що пункт про Соляріс все-таки вірний? blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_facts : стан віртуальної пам'яті сьогодні складається з загальної суми фізичної оперативної пам’яті та місця обміну на диску. Solaris НЕ вимагає взагалі налаштовувати будь-який простір підкачки. Якщо ви виберете цей варіант, як тільки оперативна пам’ять заповниться, ви не зможете запускати нові процеси. Я думаю, що я бачу, у чому полягає ваша думка - якби ви хотіли сфотографувати щось велике, ніж фізичний баран, без свопу ви не змогли? (Незалежно від того, що mmap - лінивий ініціалізатор).
синтезаторпател

5
Так, я впевнений, що мій погляд про Соляріс все-таки вірний. Навіть якщо цитата Вашого Джима Лорана відповідає дійсності, тобто Solaris не вимагає swap, не мати своп означає, що всі резерви пам'яті (тобто malloc) повинні бути підкріплені оперативною пам'яттю, навіть якщо частина виділеної пам'яті не використовується. Це не пов’язано з великими mmap або tmpfs, хоча tmpfs також є причиною, чому ви, можливо, захочете обмінятися програмою Solaris (і для цього теж Linux).
jlliagre

1
Оновлення для Linux: надмірна комісія може бути вимкнена, алгоритм OOM може бути змінений, ви навіть можете мати власний обробник OOM з групами.
петерф

1
@peterph Якщо вимкнути надмірну передачу в Linux, зробити своп ще менше анахронізмом. Якщо ви не перезавантажуєтесь, вам потрібно переконатися, що у вас є обмінний пункт достатньо великий, щоб усі резерви були підкріплені.
jlliagre

1
Віртуальна пам'ять, зарезервована виделкою, залежить від розміру програми, яка її виконує. Скажімо, у вас java VM, який використовує розгалуження 2 Гб пам'яті, тимчасово знадобиться ще 2 Гб. Якщо це станеться, поки у вас є менше 2 ГБ в наявності або одночасно кілька разів, одна або декілька виделок вийде з ладу. Це звичайна ситуація і з ОС, що не перекладає на себе зобов'язання, і з Linux також, коли надмірна комісія відключена. Це можна легко виправити, маючи достатньо велику площу свопу, що IMHO є досить кращим рішенням, ніж перевиконання пам'яті.
jlliagre

3

Я знаю одну з причин тримати своп. У мене є додаток, який займає стільки пам'яті, скільки я можу дозволити собі налаштувати для своєї системи. Він використовує Hadoop, який в одній частині обробки виконує функцію fork та exec для запуску єдиної команди unix (я думаю, що "unme" або "user" або те, для чого вони не могли знайти еквівалент Java). Схоже, java не робить vfork з копією на семантиці запису, як це було б у нативної програми. Якщо я запускаю додаток, використовуючи 4 Гб оперативної пам’яті, коли він роздвоюється, форк використовує ще 4 Гб оперативної пам’яті, але потім швидко звільняє його. Якби у мене не було 4Gb swap для того, щоб Hadoop мінявся, я повинен був би заплатити за 8Gb оперативної пам’яті, просто за 4Gb для свого додатка.


Це чудовий момент, але не відображення сучасного fork () - На Linux та FreeBSD (і, нібито OSX?) Fork () реалізується через використання сторінок копіювання на запис. Копіювання на запис (або COW) - це метод затримки або взагалі запобігання копіювання даних. Замість того, щоб дублювати адресний простір процесу, батько та дитина можуть спільно використовувати одну копію. Дані, однак, позначаються таким чином, що якщо вони записуються, робиться дублікат і кожен процес отримує унікальну копію. Бібліографічні посилання: forums.freebsd.org/showthread.php?t=26355 та Linux manpage for fork ()
синтезаторпател

Незважаючи на те, що правда, є деякі сторінки, які не можна позначати COW. Наприклад, сторінки, що використовуються для стека ядра нового дочірнього процесу, і сторінки, що використовуються для внутрішніх структур даних (the files_struct, the struct signals, the task_structта інші). Крім того, багато виконуваних сторінок не залежать від позиції коду (PIC) і, таким чином, сторінки виконуваного коду, які були змінені динамічним завантажувачем ( ld-linux.so), повинні мати для них зарезервований простір, навіть якщо нічого не написано для негайного розміщення місця. Тому я люблю Linux; ви можете вимкнути своп і система все ще працює. :)
Ажрей

3

Я не можу додати до дискусії технічно, але можу навести кілька прикладів. Мій старий ноутбук (2 Гб оперативної пам’яті kunbuntu lucid), як правило, працює зі свопом у 0. Коли я запускаю передачу (bittorrent client) з кількома торентами, які можуть спільно використовувати 100 підключень, мій своп може збільшитися. Це стає ще гірше, коли в мене працює XP vm, який використовує 1 Гб реальної пам'яті.

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

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


Ну так, застарілі системи не можуть зробити багато, якщо не включено своп. У мене все ще є стара підмножина з 256 Мб оперативної пам’яті, де потрібен своп для запуску майже будь-якої програми. Я вважаю, що питання стосується сучасних систем.
Дмитро Григор’єв

3

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

Погляньте на цей найпопулярніший http://techreport.com/articles.x/16255 Це в основному інтерфейс від S-ATA до DDR2-RAM. Ви можете заповнити до 64 Гб оперативної пам’яті. Розмістивши місцями для заміни на одному з тих, ви отримуєте значну додаткову оперативну пам’ять. Звичайно, це не так швидко, як звичайна системна ОЗУ. Але це свого роду перетворює системну оперативну пам’ять на свого роду додатковий шар кешу.


1
Зважаючи на те, що його ціна (549 доларів) не буде ефективніше інвестувати 100 доларів у основну плату, що підтримує 64 ГБ оперативної пам’яті ?
Дмитро Григор’єв

1
@DmitryGrigoryev: Звичайно. Але іноді ви змушені використовувати цей конкретний вид апаратного забезпечення (бо з причин , кашлем медичної системи сертифікації кашлем ) , але і мати справу з неймовірно великими наборами даних , отриманих в дуже короткий час (думаю , томографи, datarates> 3GiB / s).
datenwolf

Чи не доведеться вам сертифікувати привід оперативної пам’яті як медичний пристрій? ;) Але так, я зрозумів.
Дмитро Григор’єв

1
@DmitryGrigoryev: Дійсно, ви повинні це зробити. Однак сертифікація такого дискового пристрою S-ATA RAM набагато, набагато простіше, ніж сертифікація цілої материнської плати. Під час пошуку для комп’ютерів, що використовуються в медичному обладнанні, ви зазвичай купуєте якомога більше компонентів, сертифікованих поза продажу. Для тих частин, де нічого не існує з легкою сертифікацією, ви можете зробити необхідні тести та сертифікацію самостійно. Особливо під час роботи в дослідженнях, де акцент робиться на безпеці пацієнтів, а дані не використовуються для планування лікування, це найбільш економічно ефективне та швидке рішення. BT; DT.
datenwolf

3

Я працював у Linux та Windows без підкачки (файл підкачки, у номенклатурі Windows) на ноутбуках / настільних комп'ютерах з 4 Гбіт або більше. Є кілька випадків, коли відбувається виснаження пам’яті, я просто займаюся ними. Я вважаю, що система таким чином сприятлива, про що я більше дбаю. Особливих вимог щодо мого навантаження немає.

Що я навчився:

  • Windows з часом «втрачає» пам’ять, приблизно за 20-30 днів безперервного часу я потрапляю до моменту, коли я вважаю за краще просто перезавантажуватися. Я не знаю, чому це відбувається. Я здогадуюсь, що це може бути або витік у деяких драйверах, або антивірус. Коли у вас є файл підкачки, я вважаю, що він може помістити цю витік пам'яті у файл підкачки, тому важче помітити цю проблему в звичайній системі Windows.
  • Firefox краще справляється з меншою кількістю пам'яті, ніж Chrome. Firefox попереджає вас і все ще працює, Chrome просто виходить з ладу.

2

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

Однак для робочого столу я вважаю своп корисним, коли я натискаю і вискакую завдання.

Наприклад, якщо я працюю над завданням за допомогою програми, Aа потім виявляю, що мені потрібно використовувати додаток Bдля чогось (або підзадачі, або переривання), мені подумки простіше дозволити Aпоміняти диск на час роботи у Bніж закрити, Aа потім пам’ятайте, щоб запустити його знову.

Це особливо справедливо, якщо Aутримується якийсь незбережений стан, який не буде відновлено при його перезапуску.

Незалежно від того, чи швидше натискати та витягувати Aдо / із свопом або закривати та перезавантажувати, залежить від програми. (Деяким вдається мати повільний запуск, але невеликий розмір житла.)

Однак я погоджуюся, що кращим рішенням для підвищення продуктивності буде встановлення додаткової оперативної пам’яті.


Оновлення: Після написання цієї відповіді я володів ноутбуком з великою кількістю оперативної пам’яті та повільним жорстким диском. У такому випадку моя порада змінилася! Ось підсумок плюсів і мінусів .
joeytwiddle

1

У моїй системі / tmp розливається, щоб помінятись, якщо вона занадто сильно зменшує оперативну пам'ять.

Це набагато швидше, ніж використання реальної файлової системи для / tmp.


Це досить небезпечно - якщо мені потрібні ramfs, я вказую в fstab (або параметри), щоб явно встановити розмір. Це так само ймовірно, що програма може перетворитись на божевільну манеру з розподілом пам'яті, адже це те, що вона почне створювати файли в / tmp. Обмін буде погане місце для RamFs файлів , щоб показати (особливо , якщо ви покладаєтеся на RAMFS для швидкості)
synthesizerpatel

2
Я часто перевищую розмір оперативної пам’яті. tmpfs, що підтримується свопом, значно швидше, ніж ext2, навіть при розливі.
Джошуа

Корисно знати - і, мабуть, це буде майбутнім дослідницьким предметом для розгляду - я все одно буду стурбований тим, що програма заповнює мій баран проксі-сервером tmpfs / ramfs в / tmp. Це дає мені heebie jeebies!
синтезаторпатель

Потім встановіть обмеження = розмір свопу.
Джошуа

Між іншим, це різниця між ramfs та tmpfs. tmpfs може перетікати, щоб помінятися, а ramfs не може.
Джошуа

1

Причин, коли використовується своп, є багато причин.

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

Пізніше, коли ці додатки повинні щось зробити (наприклад, деякі дані надходять у сокет або деякі таймери) - ядро ​​поставить інший додаток для заміни.

Ще один приклад використання swap - призупинення на диску.

Щодо вбудованих пристроїв, їх усіх можна розділити на (принаймні) дві великі групи:

  1. вони запускають Linux / Windows або подібні не-RTOS (в режимі реального часу); або
  2. вони запускають RTOS.

Звичайно, є пристрої, які працюють лише з деяким кодом (якісь мікроконтролери) і т. Д. Я б не описував їх, оскільки такі пристрої не мають ОС, тому обговорювати своп для таких пристроїв безглуздо.

Перша група вбудованих пристроїв (під управлінням деяких ОС) може використовувати (і зазвичай вони використовують) своп. І взагалі такі пристрої використовують swap так само, як настільні та сервери.

Друга група пристроїв (під керуванням RTOS) взагалі не використовує своп, оскільки RTOS має обмеження в часі на реагування на подію, і

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

BTW, є багато опису того, як Linux використовує своп, одним з них є http://distigledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page, що
використовує Windows подібний підхід.


Крім того, потрібен своп для сплячки (призупинення на диску), якщо ви не використовуєте щось на зразок TuxOnIce.
Ренан

1

Мені здається, що і в сплячому режимі, і в гібридному режимі сну потрібні місця для обміну в Linux .

Я ніколи не використовував swap space / partition в Linux, поки не зіткнувся з необхідністю використання Hybrid Sleep - оскільки сон на критичному рівні батареї недоступний у моїй системі, як це робив Upower, який здійснює вибір лише між функціями Shut-Down, Hibernate та Hybrid. -спати. (докладніше тут )


0

Я бачив кілька корисних застосувань - це процеси, які використовують багато пам'яті, але не є критичними. Один випадок - це стародавня Firefox, яка погано просочилася пам'яттю. Він заповнить оперативну пам'ять і перекинеться на своп, не маючи поганого ефекту. Ще один у нас був наш рекурсивний DNS-сервер (ті швидко створюють величезний кеш, який рідко використовується).

Інше пояснення, яке я бачив щодо swap, проходило дещо уздовж рядків: "Вам кажуть, що завжди налаштовуйте SWAP = 2 * ОЗУ. Це повна дурниця, немає зв'язку між оперативною пам'яттю та свопом. Поміняти це на пристосування шипів у використанні пам'яті. , вам слід додати достатньо пам'яті, щоб більшість часу ваш навантаження поміщався в оперативній пам’яті. Якщо ваш навантаження стабільний, вам не потрібен своп. Якщо навантаження сильно варіюється, вам потрібно досить помінятись на шипи, і організуйте так, щоб swap використовується досить рідко, щоб не вплинути на продуктивність в цілому. Підсумовуючи, оскільки ви поняття не маєте, якими є ваші навантаження на спалах, і оскільки диск настільки дешевший, ніж оперативна пам'ять, налаштуйте SWAP = 2 * ОЗУ. "

Деякі старі версії Solaris взагалі не могли використовувати swap, якщо не було принаймні стільки свопів, скільки оперативної пам’яті (я пам’ятаю, що він виділив фіксований простір для заміни для виходу з оперативної пам’яті чи щось подібне), тому 2 * оперативна пам’ять справді була приблизно мінімально чутлива значення. Але це було епохи тому, коли наша велика машина мала 64 МБ оперативної пам’яті та диск на 1 Гб…

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