У вашому питанні є кілька різних аспектів.
По-перше, яке ваше визначення поняття "вільне". Це насправді не так просто, як це звучить в Linux (або будь-якій сучасній операційній системі).
Як Linux використовує оперативну пам’ять (дуже спрощено)
Кожна програма може використовувати частину вашої пам'яті. Linux використовує всю інакше незайняту пам'ять (за винятком останніх декількох Мб) як "кеш". Сюди входить кеш сторінок, кеш-пам'ять inode тощо. Це гарна річ - це допомагає прискорити нагромадження груп. Як запис на диск, так і читання з диска може бути надзвичайно прискорений кешем.
В ідеалі у вас достатньо пам'яті для всіх ваших програм, а у вас ще є кілька сотень Мб для кешу. У цій ситуації, поки ваші програми не збільшують використання пам'яті і система не бореться, щоб отримати достатньо місця для кешу, немає необхідності в будь-якому обміні.
Як тільки програми вимагають більше оперативної пам’яті, вона просто потрапляє в деякий простір, який використовувався кеш, скорочуючи кеш. Розподіл кешу є досить дешевим та простим, що це просто робиться в режимі реального часу - все, що сидить у кеші, є або лише другою копією того, що вже є на диску, тому його просто можна миттєво розмістити, або це щось, що ми б довелося змивати на диск протягом декількох секунд в будь-якому випадку .
Це не характерна для Linux ситуація - всі сучасні операційні системи працюють таким чином. Різні операційні системи можуть просто повідомляти про безкоштовну оперативну пам’ять по-різному: деякі включають кеш як частину того, що вони вважають "вільним", а деякі можуть - ні.
Коли ви говорите про безкоштовну оперативну пам’ять, набагато важливіше включати кеш, тому що він практично безкоштовний - він доступний, якщо будь-яка програма вимагатиме цього. У Linux free
команда повідомляє про це обома способами - перший рядок включає кеш у використаному стовпці ОЗУ, а другий рядок включає кеш (та буфери) у вільному стовпчику.
Як Linux використовує своп (ще більш спрощений)
Після того, як ви використали достатньо пам'яті, що не вистачає для плавно кешованого кешу, Linux може вирішити перерозподілити частину невикористаної пам'яті програми з оперативної пам'яті для заміни.
Це не робиться за певним обмеженням. Це не так, як ви досягаєте певного відсотка розподілу, тоді Linux починає мінятися. Він має досить «нечіткий» алгоритм. Це враховує багато речей, які найкраще можна охарактеризувати «скільки тиску існує для розподілу пам’яті». Якщо є багато «тиску» для виділення нової пам’яті, то це збільшить шанси на те, що деякі будуть помінятися, щоб звільнити більше місця. Якщо "тиск" буде меншим, то це знизить ці шанси.
У вашій системі встановлено функцію "простоти", яка допоможе вам налаштувати, як обчислюється цей "тиск". Зазвичай це не рекомендується змінювати, і я б не рекомендував змінювати це. Обмін загалом є дуже хорошою справою - хоча є кілька крайніх випадків, коли це шкодить продуктивності, якщо дивитися на загальну ефективність системи, це чиста вигода для широкого кола завдань. Якщо ви зменшите свобідність, ви дозволяєте обсягу пам’яті кешу скоротитися трохи більше, ніж це було б інакше, навіть коли це дійсно може бути корисним. Чи це достатньо хороший компроміс для будь-якої проблеми, пов'язаної із заміною, залежить від вас. Ви просто повинні знати, що ви робите, це все.
Існує добре відома ситуація, коли своп дійсно шкодить сприйманій продуктивності настільної системи, і саме в тому, як швидко додатки можуть знову реагувати на введення користувачів після довгого простою і тривалих фонових процесів в IO (наприклад, ніч резервного копіювання) запустити. Це дуже помітна млявість, але недостатня, щоб виправдати вимкнення swap всіх разом і дуже важко запобігти в будь-якій операційній системі. Вимкніть своп, і ця початкова млявість після резервного копіювання / сканування вірусів може не відбутися, але система може працювати трохи повільніше протягом усього дня. Це не така ситуація, яка обмежується лише Linux.
Вибираючи, що потрібно замінити на диск, система намагається вибрати пам'ять, яка насправді не використовується - читати чи писати з неї. Він має досить простий алгоритм для обчислення цього, який вибирає більшу частину часу.
Якщо у вас є система, де ви маєте величезну кількість оперативної пам’яті (на момент написання 8 Гб - це величезна кількість для типового дистрибутива для Linux), то ви дуже рідко коли-небудь потрапите в ситуацію, коли заміни взагалі потрібні. Ви навіть можете спробувати відключити своп. Я ніколи не рекомендую робити це, але тільки тому, що ви ніколи не знаєте, коли більше оперативної пам’яті може врятувати вас від збоїв у програмі. Але якщо ви знаєте, що вам це не потрібно, ви можете це зробити.
Але як своп може пришвидшити мою систему? Чи не поміняєш повільні речі?
Акт передачі даних з оперативної пам’яті на своп - це повільна робота, але вона приймається лише тоді, коли ядро впевнене, що загальна вигода переважає це. Наприклад, якщо пам’ять вашої програми зросла до того, що у вас майже не залишилось кешу, і ваш ввід / вивід дуже неефективний через це, ви можете фактично отримати набагато більшу швидкість зі своєї системи, звільнивши трохи пам'яті, навіть після первинних витрат на обмін даними, щоб звільнити їх.
Це також в крайньому випадку, якщо ваші програми дійсно вимагають більше пам'яті, ніж ви насправді маєте. У цьому випадку заміна необхідна для запобігання ситуації поза пам'яттю, яка часто призводить до збоїв програми або до примусового вбивства.
Обмін пов'язаний лише з часом, коли ваша система працює погано, оскільки це відбувається в періоди, коли у вас не вистачає корисної оперативної пам’яті, що сповільнить вашу систему (або зробить її нестабільною), навіть якщо ви не зробили своп. Отже, щоб спростити речі, заміна відбувається через те, що ваша система забивається, а не навпаки.
Коли дані перебувають у свопі, коли вони знову з’являються?
Передача даних поза свопом (принаймні, для традиційних жорстких дисків) так само трудомістка, як і їх розміщення. Тож зрозуміло, що ваше ядро буде настільки ж неохоче видаляти дані зі свопу, особливо якщо воно фактично не використовується (тобто читається з або записується в). Якщо у вас є дані в свопі, і вони не використовуються, то це насправді добре, що вони залишаються в свопі, оскільки це залишає більше пам’яті для інших речей, які використовуються, потенційно прискорюючи вашу систему.
free -m
,top -b 1