Чи потрібно мені міняти місцями, якщо в мене є достатня кількість оперативної пам’яті?


91

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

Це чудово, коли ви працюєте на машині з невеликою кількістю оперативної пам’яті і не хочете стикатися з проблемами, якщо ви закінчитеся. Однак, якщо у вашій системі є 16 ГБ або 32 ГБ оперативної пам’яті, і якщо ви припускаєте, що ви не запускаєте базу даних MySQL для StackExchange або редагуєте повнорозмірний фільм 1080p в Linux, чи слід використовувати розділ підкачки?


16
@mikeserv Ви знаєте, я хотів би прийняти ці два листи як відповідь лише для комедійного ефекту.
IQAndreas

3
@Janis - це коштує багато. І ви могли б легко обійтися без заміни навіть на 1 Гб апараті, якби реалізували управління звуковою пам'яттю. Витрати на заміну витрат - коли у вас є, ядро ​​неминуче його використовуватиме. Отже, на диску 1 ТБ або будь-якого розміру, що створює своп-розділ, це запрошення до ядра, щоб розмістити сторінки пам’яті на диску, а не зберігати їх в оперативній пам’яті або повністю викидати їх. З 16 Гб типовий користувач ніколи не підходить використовувати це все - я використовував 24 Гб оперативної пам’яті з 2 ГБ і кеширований 10 ГБ (тому що я мав торрент /tmp) після 3-х днів роботи.
mikeserv

5
@mikeserv, ти неправий, боюся; Я постійно спостерігав показані дискові метрики. Поки є вільна пам'ять, своп не використовувався, лише коли заповнена пам'ять, почалася заміна. Я думаю, це залежить від того, як ти користуєшся комп’ютером; настільна система, яка вимикається щовечора, рідко стикається з проблемами пам’яті, хоча в моїй системі було кілька місяців. Так, заміна витрат на продуктивність, але якщо не залишилося місця в оперативній пам'яті, система може продовжувати працювати. Який у вас варіант? Можливо, ви можете детальніше розглянути аргумент управління пам’яттю. Я використовую свою систему Linux як попередньо налаштовану.
Яніс

40
@mikeserv як ти опублікував коментар, менший ніж 15 символів?
іммібіс

Відповіді:


98

Так.

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

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

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

Щоразу, коли ви запитуєте нову сторінку пам'яті в операційній системі, менеджер пам'яті повинен приймати освічене рішення:

  1. Очистити сторінку з буфера кеша
  2. Очищення сторінки з відображення (фактично така ж, як №1, у більшості систем)
  3. Перемістіть сторінку, до якої не було доступно тривалий час - бажано ніколи - для обміну (це може насправді навіть статися проактивно, не обов'язково в останній момент)
  4. Вбийте процес або вбийте випадковий процес (OOM)
  5. Ядра панікує

Опції №4 та №5 дуже небажані і відбудуться лише в тому випадку, якщо в операційній системі немає іншого вибору. Варіанти №1 і №2 означають, що ви викинете щось, що вам, можливо, буде потрібно незабаром знову. Це негативно впливає на результативність.

Варіант №3 означає, що ви переміщуєте те, що вам (ймовірно) незабаром не потрібно на повільне зберігання. Це добре, тому що тепер те, що вам потрібно, може використовувати швидку ОЗУ.

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

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

[EDIT]

Уважний читач mmap сторінки керівництва , а саме опис MAP_NORESERVE, помітить ще одна причина , чому своп є в деякій мірі необхідності навіть в системі з «досить» фізичної пам'яті:

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

- Зачекайте хвилинку, що це означає?

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

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

[/ EDIT]

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

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

Навіть на SSD, swap - це на порядок повільніше, ніж оперативна пам'ять (через пропускну здатність і затримку шини), і хоча дуже зручно переміщувати щось для заміни, що, ймовірно, знову не знадобиться (тобто, швидше за все, ви не будете знову поміняти його, щоб ваш пул доступних сторінок ефективно збільшився безкоштовно), якщо вам дійсно потрібні значні обсяги заміни (тобто у вас є додаток, який використовує, наприклад, набір даних 50GiB), ви майже втратили.

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


7
Повністю неправда: ядро ​​може бути перевагою не використовувати диск, особливо якщо ви налаштували OOM для своїх специфікацій. Якщо вбивця OOM налаштований на обробку вашої очистки, тоді це робити, а не витрачати дисковий простір і сповільнювати роботу машини, є вигідним.
mikeserv

22
Яка різниця між 8 ГБ оперативної пам’яті та 8 Гб свопом та 16 ГБ оперативної пам’яті та відсутністю заміни? Якщо ваш комп’ютер вирішить, що йому потрібно 16,001 Гб оперативної пам’яті, чи не почне він чистити / вбивати речі так само (але продуктивність буде кратер, перш ніж вона почне відбуватися)?
Нік Т

5
@ NickT: своп не для більшої кількості оперативної пам’яті настільки, як червоний прапор, що щось незабаром буде вбито. Мені подобається мати червоний прапор перед вбивством, а не те, щоб процес "випадковим чином" зник перед моїми очима.
Mooing Duck

10
-1 ця відповідь не має сенсу. Чому б чорт мав повільнішу пам'ять (своп), мав кращу продуктивність, ніж той самий об'єм швидшої пам'яті (ОЗП) ?? в якийсь момент ви повинні визнати достатню кількість оперативної пам’яті, значить, не потрібно міняти
місцями

14
@Mehrdad: Це, безумовно, має сенс. Повільна пам'ять (своп) покращує продуктивність, наскільки "повільніше" не має значення для речей, до яких ви отримуєте доступ рідко або ніколи. Swap ефективно збільшує об'єм пам'яті, доступної для "гарячих" даних, переміщуючи "холодні" дані. Демон, які виконують щось лише раз на годину або пам'ять, виділену модулем ядра, який завантажується за замовчуванням, але ніколи не використовується, є прикладом цього. Ви можете поміняти ті , або ви можете замість впустити сторінки з кешу. Який з них кращий?
Деймон

50

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

Сьогодні я розміщую їх приблизно в 1-1,5 рази. Пам'ять у 2 рази використовувалась як правило. Обмінний диск "дешевий" тим, що його не потрібно створювати резервні копії чи захищати.

Якщо вам не вистачає пам’яті, ваш обмінний простір дає трохи часу та подушки для вирішення проблеми.

Зрозумійте, що такі речі, як / tmp, можуть знаходитись у просторі swap.

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


16
+1. Зміна своп означає різницю між пошкодженою продуктивністю при низькій пам’яті та жорстким збоєм.
Давідм

6
@mikeserv незалежно від того, як ви його налаштовуєте, якщо ваша програма намагатиметься виділити більше пам’яті, ніж є доступна, щось зірветься, або ОС почне їх вбивати.
Давідм

6
@Davidmh: З цього приводу ваш файл swap повинен бути нескінченно великим, інакше ваші програми все одно будуть виходити з ладу, коли вони вичерпають файл swap.
Мехрдад

6
@Mehrdad, але це також дорожче. Зважаючи на те, що у вас є X ГБ оперативної пам’яті, оскільки це стільки, скільки ви можете собі дозволити, це суворо гірше, ніж наявність X ГБ оперативної пам’яті та Y заміни, для деяких розумних значень Y (це залежатиме від вашого використання та розміру ваш HD).
Давідм

9
"ваш простір для обміну дає вам трохи часу та подушки для вирішення проблеми" - Це також означає, що я повинен сидіти так довше перед невідповідною машиною, поки витік пам'яті "не вирішиться".
Рафаель

23

Може бути:

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

Почніть з активного swap-розділу, який, на вашу думку, є достатнім розміром.

Потім відкрийте термінал в робочій області і видайте команду, free -hs 1яка буде повідомляти про використання раз на секунду.

Необов’язково переходити на інші робочі області.

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

Коли ви відчуваєте, що система перебуває під великим навантаженням (або настільки високою, як колись ви отримаєте, а потім і деякими), подивіться на термінал і вивчіть результати. або ще краще перенаправлення виводу у файл, додавши >output.txtдо команди, щоб ви могли вивчити повний запуск. Якщо ваш використаний Swap ніколи не перевищує Mem безкоштовно, вам не потрібен своп. Якщо це так, ви робите. free.png

Мені не потрібен своп. Можливо, і ви. Чому б не дізнатися?

Що стосується розміщення розмірів, то правила правила, як правило, завищені, оскільки це питання на основі використання.


2
Отже, ви кажете, що своп використовується коли-небудь тоді, коли ваша система цього абсолютно вимагає? У такому випадку коли-небудь буде штраф за включення свопу - про всяк випадок? Інші коментарі, мабуть, говорять про те, що навіть наявність своп може бути згубною для продуктивності?
MrWhite

3
@ w3d Ні, я цього не кажу. Як видно з мого результату вище, swap використовується, навіть якщо він не потрібен. це можна дещо скорегувати за допомогою коефіцієнта зручності. Я говорю про необхідність заміни чи ні.
Старійшина Гейк

Чи можете ви написати цей сценарій для збільшення розміру вгору в будь-який час, коли він swapперейде free?
JFA

@JFA Я цього не бачив. Особисто у мене виникають труднощі з концепцією резервування невизначеної кількості місця для заміни для цієї мети. Теоретично все можливо. Це фаза впровадження, яка стає цікавою.
Старійшина Гік

17

ПРИМІТКА. Це сталося зі мною, у конкретній, незвичній ситуації. Якщо ви вирішите проблему, це може бути корисним. Я не маю на увазі, що ВСІ машини повинні ОБОВ'ЯЗАТИ підміна.

МОЖЕ БУТИ!

У минулому я зіткнувся з проблемами з "пристроєм", який я створив, запустивши Linux - працюючи на компактному флеш-пристрої, я не хотів носити свій CF, використовуючи swap, і було достатньо пам'яті для програми.

Більшість цих приладів працювали чудово, але в особливо зайнятій коробці я зіткнувся з проблемою:

ПАМ'ЯТНЕ ФРАГМЕНТАЦІЯ

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

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

Перевірте / proc / buddyinfo - моє виглядає ось так:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

Цифри представляють блоки різних розмірів; кожен розмір - це половина розміру наступного блоку, від 4mb блоків зліва, до 4kb праворуч (тобто 4mb, 2mb, 1mb тощо). Щойно завантажена машина повинна мати всі блоки зліва, дуже мало праворуч (= не фрагментовано). Пам'ятайте також, що той самий об'єм пам'яті (наприклад, 4 Мб) буде представлений у вигляді різних чисел у стовпцях - 1 блок у самому лівому стовпчику, 1024 у самому правому стовпчику.

Пам'ять виділяється з максимально правого пулу; наприклад, якщо ваша програма хоче 12 КБ пам'яті (за один раз), вона візьме її з стовпця 16 Кб; решта з’явиться у стовпці 4 кб. Якщо немає блоків 16 кб, то це займе 32-кбайтних блоків, в результаті чого залишиться 16 кб і 4 кб, і так далі.

Якщо блоків пам'яті немає достатньо великих розмірів, і ви маєте простір SWAP, тоді, наприклад, якщо ви хочете 16 Кб пам'яті, він знайде найменш використаний блок розміром 16 кбіт (який може, наприклад, містити блок, що використовується 4 кб, блок доступний 4 кб, та ще 2 використовуваних блоки 4kb), переміщуйте USED-частини лише для заміни та виділіть звільнену пам'ять новій програмі.

У коробці, що розбився, я мав сотні тисяч блоків 4kb та 8kb, і не багато іншого.

ЯК Я МОЖУ СКАЗАТИ (ідучи через розбиті машини!) Ядро буде переходити з пам’яті на своп і замінюватися на пам’ять, але ніколи не переміщуватиметься з пам’яті в пам’ять.


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

2
Це найкраща причина, яку я коли-небудь читав на користь використання розділу swap. Я спробував швидкий пошук і не знайшов посилання на нього, мені цікаво, чому ця функція не так часто документується.
До 마 SE

1
(непрозорі) величезні сторінки можуть не використовуватися вашим додатком. Зазвичай програми, які потребують тонни пам'яті, можуть використовувати їх; наприклад, сервери баз даних, java jvm. Вони повинні бути чітко включені, і вони стають окремим пулом пам'яті, який не можна використовувати для інших цілей. Це може бути добре, а може бути погано, залежно від ваших обставин. Також дізнайтеся про прозорі величезні сторінки. Ці спроби перемістити речі так, щоб ви використовували величезні сторінки (для покращення їх продуктивності), хоча ваші програми не знають, як. Якщо пам'ять є фрагментарною, речі можуть піти на південь, оскільки розгортка величезної сторінки має ще багато чого робити.
Dan Pritts

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

1
Подальше запитання . Що ви маєте на увазі під "фрагментацією пам'яті"? MMU не байдуже, чи фізичні сторінки, які використовуються для послідовних сторінок у деякому віртуальному адресному просторі, є послідовними чи ні. Фізичні сторінки фрагментовані, але це не має значення (поки ми говоримо про звичайну пам'ять додатків на однокластерній фізичній машині, а не, наприклад, на сторінках пам'яті, які використовуються периферійними пристроями або гіпервізором). Коли програма просить 16 КБ, вона отримує чотири сторінки, які можуть бути, а можуть і не знаходитися поблизу фізичної пам'яті.
Жиль

15

Підрозділ swap має значне значення вище і далі просто виступає в якості додаткової оперативної пам’яті, коли ви закінчите

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

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

Ці фактори разом змушують мене особисто вважати, що краще проводити деякий обмін майже в кожній звичайній системі, проте для великих розмірів оперативної пам’яті я ігнорую правило ram * 2 і просто обмежую свій обмін на рівні 4-8 Гб (залежно від розміру диска ).


9
Навіть 4 ГБ занадто великий для робочого столу. Я вважаю за краще вбивцю OOM активувати перед тим, як чекати, коли заміна буде заповнена, якщо щось піде не так. (Якщо я коли-небудь натрапляв на випадок, коли мені потрібно було більше, я міг би здійснити обмін файлом і змінити його, перш ніж виконувати будь-яку величезну роботу, потрібну більше віртуальної пам’яті, ніж моя машина мала оперативну пам’ять. Тобто, якщо вихід із веб-браузера не вивільнився достатньо ...)
Пітер Кордес

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

1
кумедна історія: саме сьогодні, на моєму ноутбуці з 4 ГБ оперативної пам’яті, 0,5G свопом (SSD), firefox запустив кілера OOM (який вибрав firefox). У мене раніше цього не було. (Хоча я використовував свій ноутбук більше, ніж зазвичай). Практично нічого іншого не було запущено (просто gnome-terminal у xfce). Тому я думаю, що я з цим все в порядку, оскільки Firefox повинен знати краще, ніж підключати стільки оперативної пам'яті. Я бачив, як хтось сказав, що "веб-браузери існують, щоб стрес-тестувати підсистему віртуальної пам'яті", чи щось подібне. Firefox досить погано звільняє кеші для вкладок, які не використовуються цілими днями тощо
Peter Cordes

3
Один випадок, коли Linux розглядає доступний простір для обміну, - коли великий процес намагається запустити дитину: системні виклики fork () + exec () починаються з приблизно дублювання виділення батьків - ядро ​​не може гарантувати, що нова дитина буде меншою ніж батьківський. Місце обміну зазвичай не використовується, але, якщо воно недоступне, вилка () може вийти з ладу. Типовим прикладом для клієнта є браузер, який запускає плагін, або на сервері, коли великий контейнер додатків викликає програму-помічник. Для вирішення проблеми зазвичай вистачає 1/2 або 1 Гбіт свопу. Google "java exec не може виділити пам'ять"
Джеймс

13

Ви ніколи не повинні мати своп більше, ніж максимальний розмір, який ви могли б терпіти, чекаючи, коли ядро ​​замінить / вимкне; в іншому випадку ви просто створюєте новий режим відмов для вашої системи (стаючи непереборно забитіми при заміні). Зауважте, що, незважаючи на те, що сучасні накопичувачі можуть передавати порядок GB / sec, Linux, як правило, може лише переміщувати своп із швидкістю, що перевищує лінійку сотень кБ, або, в кращому випадку, Мб, в секунду. Таким чином, величезний обмін може залишати вашу систему непридатною протягом хвилин, годин і навіть днів.

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

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


2
Я думаю, що це найкраща відповідь. Якщо у вас занадто багато місця для заміни, це може зробити машину абсолютно невідповідною через всі заміни. Це означає, що ви не можете вбити злочинця. Якщо ви скоротите місце для обміну, вбивця OOM автоматично зробить вашу роботу за вас. Аргументи інших відповідей щодо кешування буфера файлів є абсолютно непереконливими. Ви повинні мати своп, щоб ядро ​​могло переміщувати файлові буфери для обміну ... що на диску? Будь ласка.
Тиммммм

Єдиний аргумент проти місця обміну, який я можу знайти, такий: "деяка програма просочує пам'ять". І? Якщо вбивця OOM вбиває важливу річ, яку ви не врятували, ви фактично втратили роботу. Що означає, що цей аргумент стає абсолютно несуттєвим, я можу просто змусити вимкнути свою машину, щоб мати такий самий ефект, в той час як все ще маю високий простір для заміни для завдань з низьким пріоритетом, які використовують багато пам’яті та часто бувають замінені. Якщо ваша машина застрягла в такому стані, це ваша вина. Єдиний раз, коли це сталося зі мною, коли я сам написав програму, щоб заповнити всю робочу пам’ять.
Sahsahae

11

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


6

Немає універсальної і чіткої відповіді, оскільки це залежить від завдання, яке ви збираєтеся виконати. Якщо ви збираєтеся запускати сервер DB, HTTP, Virtualization або Cache, ви ніколи не вмикаєте будь-якого типу свопів, незалежно від суми оперативної пам'яті. Якщо у вас робочий стіл або хост із змішаними завданнями, і у вас є швидкість оперативної пам'яті 16+ Gb - подивіться тут: zRam


zRam - чудовий вибір. Я використовував його спільно з крихітними системами флеш-накопичувачів для хорошого ефекту.
Старійшина Гейк

1
@ElderGeek Я також використовував його в бездисковому середовищі, наприклад, завантаження мережі. Чудова робота, але є деякі застереження: по-перше, вам потрібно не просто більше барана, вам потрібно Швидке. Повільні та дешеві оперативні модулі, які, можливо, підходять вам у звичайному класичному випадку, можуть спричинити проблеми. Також слід враховувати шину передньої сторони процесора: навіть у тому випадку, коли у вас буде повільніша частота процесора, але швидша частота FSB значно покращить вашу ефективність. Друге занепокоєння викликає ряд розділів zRam swap. Спробуйте числа від 1 до вашого числа процесорних ядер. Не використовуйте в одноядерних системах!
Олексій Веснін

Гарні дійсні бали всі. Оскільки я виступник, і завжди розроблюю і будую власні системи, мене особисто не турбує така проблема
Elder Geek

@ElderGeek мені теж :) приємно познайомитися! Також я помітив одну дивну річ у поведінці zRam. Він з’являється і зникає в різних версіях і конфігураціях ядра, але добре відтворюється на ядрах HZ 100 і 1000. zRam працює чудово для 1,2,4 - але не більше розділів. Навіть на 8 та 16 фізичних ядрах на верхньому апараті для майже непрацюючих завдань. Тож майте на увазі гру з твіками! Привітання з Росії!
Олексій Веснін

Я не погоджуюся з тим, що "якщо ви запускаєте db, ... ви ніколи не повинні вмикати будь-який обмін, незалежно від того, чи є у вас кріплення оперативної пам'яті". Заміни, як правило, є кращими для випадкових процесів вбивць OOM. Так, у вас повинно бути достатньо пам'яті для запущених програм, і так, використання великої кількості свопів може уповільнити вашу систему. Я заздрю ​​тобі, що живеш в ідеальному світі.
AMADANON Inc.

5

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

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

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

  • випадок 2: Якщо у вас є місце для підкачки і немає оперативної пам’яті, ядро ​​вибере менш використані сторінки пам’яті і помістить їх у зону swap для звільнення оперативної пам’яті. Це призведе до уповільнення роботи системи, але в іншому випадку ваші програми не вплинуть.

Я завжди віддаю перевагу випадку 2, оскільки мені здається незручним втрачати частини або всю свою роботу, тому що ядро ​​вважає, що мої програми варто вбити. Крім того, якщо поточний розмір середнього диска знаходиться в діапазоні туберкульозу, резервування декількох відсотків для свопу не повинно бути проблемою.


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

1
@ Марк, це справедливий момент. Я все ще намагаюся уникати делегування алгоритму зйомки спочатку, подумайте згодом.
jlliagre

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

1
Виходячи з ваших міркувань, достатньо контролювати використання оперативної пам’яті .
Тотор

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

3

Моє правило застосовувати своп у будь-якій системі - це відповідь на це:

  • Яке призначення системи?
  • Скільки пам’яті споживають програми?
  • Це критична система?
  • Чи потрібен тимчасовий простір на диску для передачі файлів?
  • Прогнозований темп зростання додатків?

Коли я отримую відповідь за цю інформацію, я відповідно розміщую систему. У попередні роки я займався правилом від Sun Microsystem. До 16 ГБ вдвічі більше оперативної пам’яті для SWAP, від 16 ГБ на стільки ж. Але з іншого боку, якщо у вас є достатня кількість оперативної пам’яті, а ваші програми не використовують насильно SWAP, ви можете пропустити своп. Якщо вам потрібно - лише питання поставити новий диск або ланч і налаштувати SWAP. правило Sun застосовується здебільшого тому, що на Solaris у випадку "паніки з ядром" пам'ять повністю скидається для заміни для подальшого аналізу.


1

Заміни знадобляться, якщо у вас недостатньо оперативної пам’яті для запуску всіх ваших програм.

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

Тоді вам не потрібно місця для заміни.

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


Використання своп може допомогти уникнути катастрофічної аварії, але ніколи не підвищить швидкість роботи, більше ніж парашут пришвидшить ferrari. ;-)
Старійшина Гік

@ElderGeek Це може бути крайній випадок, але своп може допомогти. Бувають випадки, коли у вас достатньо всього оперативної пам’яті для всього, але непрацюючі програми можна замінити, щоб краще використовувати оперативну пам’ять (наприклад, деякі корисні кеш-диски). Я часто бачив це в кінці 90-х. Я це бачу іноді зараз, коли у мене є <1 Гб вільної оперативної пам’яті (включаючи кеш диска), не потребуючи власного місця для обміну.
jbo5112

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

@ElderGeek я можу бачити це лише зараз, оскільки моїм дискам десятиліття і в відчайдушній потребі кеш. Зазвичай виникає додаткова проблема заміщення, коли він встановлюється занадто високим для майже будь-якого випадку, що призводить до занадто агресивного використання місця для заміни. Зниження значення з 60 до 10 здається загальною рекомендацією. Ви можете піти ще нижче, але в якийсь момент ви скинете занадто багато дискового кешу, спричиняючи багато зайвих вводу-виводу під час заміни.
jbo5112

@ jbo5112 Добре. Це завжди балансуючий акт між різними підсистемами. Я пам’ятаю ще в той день, коли регулювали тимги, як перемежування жорсткого диска та швидкість оновлення оперативної пам’яті, щоб вичавити максимальну продуктивність із 80286 систем із приводами Seagate ST225 та ST238. Ми завжди мусимо підходити до речей у кожному конкретному випадку, щоб витіснити максимальну продуктивність та надійність. Вітаємо BTW! Останній раз, коли мені вдалося витягнути десятиліття з приводу, це був Micropolis, який утримував загальний 600MB.
Старійшина Гек

0

Коротка відповідь:

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

Установіть свій файл swap:

  • RAM+round(sqrt(RAM)) якщо ви використовуєте сплячку
  • round(sqrt(RAM)) якщо ви цього не зробите

Встановіть swappiness10 на робочому столі, але не на сервері!

Довга відповідь:

В минулому:

Правило, яке було використано протягом останніх 25 років, було мінімум 1xRAM та максимум 2xRAM, так що ви бачите цитований весь час.

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

Максимум було встановлено на той час через зменшення віддачі: просто надто повільно потрібно міняти стільки пам’яті, оскільки доступ до жорсткого диска в 1000 разів повільніше, ніж ОЗУ: хороший в екстреному випадку, але не дуже хороший для щоденного використання! У той час, коли у вас не вистачало місця для заміни, настав час додати більше оперативної пам’яті! (що досі справедливо).

Тепер:

  1. Якщо ви не використовуєте сплячий режим і ваша пам'ять перевищує 1GByte нове правило полягає в тому , round(sqrt(RAM))де RAM, очевидно , ваш розмір ОЗУ в ГБ.

  2. Якщо ви використовуєте сплячку, вам потрібно мати можливість поміняти весь об'єм оперативної пам’яті + вже замінену оперативну пам’ять на диск, таким чином формула стає: RAM+round(sqrt(RAM))

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

Все це разом дає вам наступну таблицю: (останні 3 стовпчики, що позначають місця заміни)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

Вище сказане - це лише велике правило; це не закон тяжіння!
Ви можете порушити це правило (на відміну від закону сили тяжіння), якщо ваш конкретний випадок використання інший!

Порада: завжди виділяйте SWAP на початку жорсткого диска, оскільки головки повинні менше рухатися на внутрішній стороні диска.
Так: На SSD, це вже не має значення, де ви знаходите область заміни, оскільки вони використовують квантове тунелювання замість рухомих головок, а сучасні SSD використовують усі їх комірки пам'яті (навіть нерозподілений простір) для запобігання квантової деградації.

Як перевірити, чи ваше використання swap відрізняється від "загального" правила:

Просто виконайте:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

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

Якщо ви використовуєте більше декількох КБ: змініть розмір до мінімального, інакше не турбуйтеся ...

Якщо ви перебуваєте на сервері, перестаньте читати зараз: все налаштовано!


Якщо ви перебуваєте на настільному / ноутбуковому клієнті (а не на сервері), ви хочете, щоб ваш графічний інтерфейс був максимально чуйним та мінявся лише тоді, коли вам це потрібно . Ubuntu був оптимізований для раннього обміну для використання сервера, але на своєму клієнті ви хочете, щоб редагування цієї величезної необмеженої картинки на 250 мегапікселів gimpбуло швидкою , тому встановлення swappinessзначення 10 не дозволить ядру занадто рано замінюватися, гарантуючи, що це не буде ' t помінятися занадто пізно:

sudo nano /etc/sysctl.conf

і додати:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

до кінця файлу збережіть файл ( Ctrl+ XY+ Enterу нано) та виконайте:

sysctl --system

щоб перезавантажити параметр або просто заради старого часу, скористайтеся підходом до Window $ та перезавантажте ... :-)


-1

Компромісна відповідь: це залежить від значення "слід".

Вам потрібен розділ swap у тому сенсі, що щось погане відбудеться, якщо у вас його немає в описаних вами умовах експлуатації? Немає.

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

Якщо ваша фізична оперативна пам’ять «значно» перевищує використання пам’яті даних всіх програм, які ви будете запускати одночасно, тоді ви не матимете переваги від продуктивності роботи. Якщо вона перевищує, але не "сильно", може бути користь для продуктивності, якщо ОС зможе замінити рідко використовувану пам'ять, щоб зберегти більш часто доступні файлові дані в пам'яті.

Підсумовуючи це, чудово, що у вас є 16 Гб оперативної пам’яті. Але якщо ви також маєте 1 ТБ диск, чи не можете ви залишити його 16 Гб для обміну? Це всього 1,5% диска.

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