Це погана ідея створити сценарій cron, який щогодини очищає своп?


26

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

Я зробив коротку cronкоманду для автоматизації цього, і я маю непогані результати:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

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


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

5
Чому ти навіть хочеш це робити? Чому ви вважаєте, що деяке використання свопів - це погана справа? Про скільки використання замінів ми говоримо?
marcelm

25
Я начебто спантеличений. Ви продовжуєте говорити про "проблему", але насправді не описуєте жодних негативних наслідків. Чому ви вважаєте це проблемою?
Девід Шварц

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

12
Як це краще, ніж просто залишити своп?
користувач253751

Відповіді:


51

Використовуючи це так: так, погано. Вам дійсно потрібно перевірити, чи достатньо пам'яті, перш ніж вимкнути своп. Дивіться /ubuntu//a/90399/15811 для кращої версії.

Також: ви впевнені в цьому? Виділення свопів не означає, що використовується своп. Команда vmstat, стовпці si(swap in) та so(swap out). Якщо таких залишається 0, у вас з’явилася ще одна проблема. На мій досвід, swap майже не використовується, і ви, можливо, не використовуєте його, думаючи, що він не спорожнює його, але порожнього немає нічого.


3
Чекати, що? Якщо пам'яті не вистачає на успіх, її вбивством спочатку вбивають убивцю OOM. Так, це насправді жорстко закодовано (це перевіряється системним викликом).
Джошуа

@ Джошуа впевнений, але він хоче, щоб це працювало автоматизовано. Не помилка.
Rinzwind

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

@Rinzwind cron відмінно працює з завданнями, які мають помилку, і пов'язаний сценарій також не використовується vmstat.
jpaugh

41

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

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


1
+1: У чому полягає велика справа? Ніколи не міняйте працюючу систему , я не думаю, що не слід возитися з такими основними функціями системи, особливо не без потреби.
десерт

3
У мене іноді виникають проблеми, коли я вбиваю процес із витоком пам’яті (що вимушує все інше заміняти), залишаючи мені ~ 10% ОЗУ, що використовується… але всі запущені програми знаходяться в обміні, доки я знову не отримаю до них доступ. Тому щоразу, коли ви щось торкаєтесь, відбувається затримка на дві секунди. Я бачу, звідки береться ОП, і було б непогано, щоб це було зроблено автоматично, але це не правильний шлях.
Хтось десь

1
@SomeoneSomewhere Але так чи інакше це не працює. Якщо процес протікає в пам'яті, то, за визначенням, він не активно використовує цю пам'ять (це не її читання і запис); це просто виділено, випадково. Якщо навколо є інші активні процеси, просочена пам’ять буде замінена, і це буде ваш обмін сповненим сміттям, а не фізична ОЗУ.
Девід Річербі

@DavidRicherby Якщо у вас програма відкрита у фоновому режимі, то ця програма все ще менш активна, ніж витік пам’яті - і коли ви перейдете до неї, вона повинна вийти зі свопу.
Хтось десь

@SomeoneSomewhere Ви, здається, неправильно зрозуміли, як працює система пам'яті. Вам не потрібно мати весь процес у фізичній оперативній пам’яті: свопом керується деталізація окремих сторінок. Будь-яка сторінка, яка не використовувалася деякий час, може бути замінена, і сторінка, яка повністю складається з просоченої пам’яті, більше ніколи не буде використовуватися, тому ніколи не повернеться назад після її заміни.
Девід Річербі

34

Це погана ідея.

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

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

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

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


4
завжди : я думаю, ви припускаєте, що /proc/sys/vm/swappinessце значення є за замовчуванням 70, що добре для серверів і досить агресивно розбиває брудні сторінки з процесів, які не торкалися їх деякий час, щоб звільнити місце для більше кеш-сторінки. Це часто погано для робочих столів, оскільки вкладка alt може повільно працювати.
Пітер Кордес

@PeterCordes, якщо сторінки фактично виселяються, то в кешах спостерігається більше доступу, ніж на сторінках програм, про що йдеться, тому користь використовувати їх як кеш-диски. Я бачу, наскільки ефективність Alt-Tab користувачеві більш помітна, ніж, наприклад, час на складання великого проекту, але мені складно сформулювати політику, яка гарантує миттєвий відгук, не приносячи шкоди занадто великій продуктивності.
Саймон Ріхтер

1
Інакше кажучи: ядро ​​налаштоване на пропускну здатність ( swappiness=70), але затримка важливіша для роботи користувачів на робочому столі. Це компроміс. Якщо ви регулярно збираєте речі, які є занадто великими, щоб залишатися в кеш-сторінках, то обов'язково залиште swappinessтрохи вище, наприклад, 20 або 30 замість 5 або 10. Дивіться також akitaonrails.com/2017/01/17/optimizing-linux-for -повільні комп’ютери . Бачення vm.vfs_cache_pressureнижче 100 також сприяє кешування метаданих inode / каталога на сторінках даних, що також добре для інтерфейсу користувача.
Пітер Кордес

1
Інші: параметри налаштування зворотного запису пороги lonesysadmin.net/2013/12/22 / ... . Вони контролюють, наскільки швидко Linux починає писати на диск після того, як щось записує у файли, і скільки брудних сторінок дозволено. (тобто скільки пам'яті можна витратити на кешування запису)
Пітер Кордес

21

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

У вас є два випадки:

  • Процеси в просторі заміни все одно не використовуються. Чому ви хочете повернути їх в оперативну пам’ять?
  • Оперативної пам’яті мало, тому вони заміняються, і ви повернете їх назад в оперативну пам’ять. Тоді ваша система якнайшвидше знову поставить їх у своп.

Отже, є два основні моменти:

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

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

Якщо ви хочете налаштувати поведінку ядра, перегляньте параметр swappiness .

Два додаткових джерела сприяє @ peter-cordes:

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


1
Дивіться також akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers та lonesysadmin.net/2013/12/22/… для отримання додаткових пропозицій / деталей.
Пітер Кордес

5

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

echo 3 > /proc/sys/vm/drop_caches

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


0

Всупереч загальній ідеї SWAP сам по собі непоганий .
Те, що насправді сповільнює вашу систему, - це діяльність ядра, яка переміщує дані з оперативної пам'яті в SWAP і повертається в оперативну пам’ять swappiness.
Система робить це автоматично, як це налаштовано з swappiness.
Це робить, що пам’ять з неактивних процесів скидається на розділ заміну жорсткого диска.
Я сам роками працював з машиною, у якої не було стільки оперативної пам’яті, і я завжди використовував деяку пам’ять SWAP. І все-таки моя машина працювала чудово, поки ви не почнете переміщувати пам'ять назад в оперативну пам’ять, можливо, намагаючись закрити відкриту програму. Потім Робоче навантаження почало збільшуватися.

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

Радше я запропонував би вам закрито вивчити, який додаток використовує вашу пам'ять у командному рядку із htopпрограмою, і вирішите закрити якусь програму. Банк gnome-system-monitorможе дати вам гарне розуміння також у своїй вкладці «Процес».
Якщо у вас є великі програми, які використовують багато оперативної пам’яті. Не запускайте їх усі відразу.

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