Чому використовується swap, хоча у мене достатньо безкоштовної оперативної пам’яті?


208

Я подумав, що вся суть swap полягала в тому, щоб діяти як мережа безпеки тимчасового зберігання, коли оперативна пам’ять була заповнена, але мій розділ swap постійно використовується, хоча іноді у мене є 3 ГБ вільної оперативної пам’яті. Це нормально?


3
Будь ласка , поділіться вмістом або виходом з наступних команд / файли , щоб краще допомогти нам вирішити проблему ( інструкції в цій відповіді ) : free -m,top -b 1
іш

Завтра оновіть питання за допомогою пастбінів цих команд. Зараз 12 ранку :(
Mysterio

Я повинен відредагувати заголовок, щоб додати "... але я занадто сонний, щоб піклуватися прямо зараз, тож ви, хлопці, теж дрімайте": P
останній

Відповіді:


188

Ви можете спробувати змінити значення "swappiness":

З поширених запитань про Swap Ubuntu :

Що таке заміщення і як це змінити?

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

  1. свопіння може мати значення від 0 до 100

  2. swappiness = 0 вказує на ядро, щоб якомога довше уникати процесів заміни з фізичної пам'яті. Для версії Kernel версії 3.5 і новішої вона вимикає заміну.

  3. swappiness = 100 спонукає ядро ​​агресивно змінювати процеси з фізичної пам’яті і переміщувати їх в кеш-пам'ять

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

Щоб перевірити значення swappiness

cat /proc/sys/vm/swappiness

Для зміни значення swappiness Тимчасова зміна (втрачена при перезавантаженні) зі значенням swappiness 10 може бути зроблена за допомогою

sudo sysctl vm.swappiness=10

Щоб зміни були постійними , відредагуйте файл конфігурації улюбленим редактором:

gksudo gedit /etc/sysctl.conf

Шукайте vm.swappiness і змінюйте його значення за бажанням. Якщо vm.swappiness не існує, додайте його в кінець файлу так:

vm.swappiness=10

Збережіть файл та перезавантажте.

Також ви можете перевірити: https://askubuntu.com/a/103916/54187


1
Непрацездатні спекуляції: це насправді може бути корисним для продуктивності - сторінки, до яких не було доступно за деякий час, можуть бути скопійовані для розміщення місця, що дозволяє ОС швидко їх виселяти, якщо вона коли-небудь потребує пам'яті, але вміст сторінки залишається в пам'яті .
Саймон Ріхтер

7
@SimonRichter Так, це ідея. Зміна 60 років, мабуть, занадто агресивна в сучасних системах, оскільки це означає, що ви починаєте обмінятися, коли у вас ще є кілька концертів вільної пам'яті.
Брендан Лонг

1
Запустіть sudo sysctl --load=/etc/sysctl.confпісля редагування файлу, щоб застосувати зміни
deFreitas

92

У вашому питанні є кілька різних аспектів.

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

Як Linux використовує оперативну пам’ять (дуже спрощено)

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

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

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

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

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

Як Linux використовує своп (ще більш спрощений)

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

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

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

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

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

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

Але як своп може пришвидшити мою систему? Чи не поміняєш повільні речі?

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

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

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

Коли дані перебувають у свопі, коли вони знову з’являються?

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


5
+1 для детального пояснення. Мені також подобається зберігати своп 2GiB на своїх комп’ютерах. Якщо щось погано - витік пам’яті тощо, то ви можете бачити, як відбувається заміна, і шукати проблему, перш ніж з’явиться пам'ять. Це захисна сітка, а також інструмент продуктивності.
Джо

1
У своєму нетбуку, який має лише 2 Гб оперативної пам’яті, я зберігаю 4 Гб свопу. Це тому, що я використовую нетбук набагато більше, ніж він був призначений, і мої програми часто вимагають більше 2 Гб пам'яті. Оскільки Linux веде себе дуже погано в ситуаціях, що не мають пам'яті, я вважаю за краще мати велику безпечну мережу. І у мене багато місця на диску.
Скотт Северанс

Якщо вашим програмам часто потрібно більше 2 Гб оперативної пам'яті, я б подумав про те, щоб там розмістити більше оперативної пам’яті (це дуже дешево!), Тому що виснажлива оперативна пам’ять зашкодить продуктивності. На користь інших читачів: переконайтеся, що ви не просто дивитесь на кеш-пам’ять, яка повинна підключити оперативну пам’ять - див. Інші посилання на free -m.
thomasrutter

2
@neon_overload: Я просто зауважу, що згідно з HP, максимальна оперативна пам’ять мого нетбука - 1 Гб. Зараз у мене є 2 Гб, і джерела Інтернету припускають, що 2 ГБ - це фактичний максимум. Таким чином, необхідність у подібних шляхах подолання.
Скотт Северанс

@thomasrutter: Як змінюється ваша відповідь на великих серверах, один з моїх має 1 ТБ (так, один повний терабайт) оперативної пам’яті, але він все ще використовує своп; який параметр заміщення та який розмір розділу для заміни ви б рекомендували?
chrisinmtown

24

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

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

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Ви повинні запустити цей скрипт як root (наприклад, з sudo). Цей сценарій не залишить вашу систему без відповіді; якщо у вас недостатня оперативна пам’ять, вона відмовиться перемикати заміну. Цей сценарій я без проблем використовую вже близько п’яти років.


+1 для сценарію. Можливо, ви хочете трохи її модернізувати, змінивши MB на MiB у висновках. Я написав подібний сценарій без усіх (хороших) тестів на безпеку, які ви включаєте. На моєму старому ноутбуці, де своп використовувався сильно, потрібно було би зайняти деякий час - хвилину чи дві, але нічого не зашкодило. Колись воно не вдалося, тому що для його запуску не вистачало вільної пам'яті, але це не викликало додаткових проблем. Мені довелося перезавантажити, щоб очистити речі, коли це сталося. Це було пов'язано з тим, що було схоже на витік пам’яті в передачі (оскільки я вважаю виправленим) і мав лише 2 Гбіт таран.
Джо

6
Якщо щось переміщено на swap, і воно залишається в свопі, це, як правило, добре - це означає, що дані фактично не використовуються, і це звільняє частину вашої оперативної пам’яті для інших матеріалів, що призводить до потенційного збільшення швидкості. Що спонукало вас до думки, що ці дані не повинні мінятись, а замість них потрібно використовувати більш цінну оперативну пам'ять? Зазвичай ядро ​​досить добре знає, що не використовується, а що може спокійно залишатися в свопі, щоб звільнити оперативну пам’ять.
thomasrutter

@neon: Майте на увазі, що мої машини мають 2 ГБ і 3 Гб оперативної пам’яті відповідно, що в ці дні зовсім небагато. Докази є у виконанні. Наприклад, створення меню або перемикання програм може бути повільним через заміну, як і Compos visoal ефекти. Цю повільність можна усунути шляхом включення swap, тим самим демонструючи, що принаймні в деяких ситуаціях алгоритми оптимізації ядра є неоптимальними. Я не можу посперечатися з повторним досвідом.
Скотт Северанс

Фу, !! Це просто збільшилось до 0% свопу .... У мене не було багато часу, щоб розглянути це повне запитання та його відповідь, але мені сподобалось прочитати його, коли я отримаю трохи вільного часу.
AzkerM

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

4

Як правило, своп залишається невикористаним у теперішніх системах. На моєму досвіді, процеси, які тривають тривалий час без інтенсивних операцій, переходять на обмін linux.
Це робить кілька постраждалих програм повільними.
Якщо у вас є безліч оперативної пам’яті, ви можете вимкнути своп, запустивши команду:
swapoff -av(вам потрібні sudoправа на це.)
Якщо вам не подобається swap, ви можете увімкнути його, використовуючи симетричну команду:
swapon -av( знову sudoпотрібно).


12
Включення свопу від повністю є зайвим , так як swapiness = 0 робить те ж саме, але більш безпечним (якщо ви робите в кінцевому підсумку занадто багато речей в пам'яті, він буде кидати то в своп).
Брендан Лонг

@BrendanLong Справедлива точка .. Дякую, що навчали мене. :)
drake01

3

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

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

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

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


2

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

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.