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


9

Більше цікавість, ніж проблема; і, я визнаю, щось невпинно основне питання:

Я помічав, що багато разів на моїй машині Linux у мене буде близько 500 Мб місця для обміну, хоча я маю ~ 600 МБ невикористаної оперативної пам’яті.

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

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

Що призводить до питання, чому ядро ​​попередньо використовує простір swap? Це частина якогось алгоритму настройки продуктивності? Чи заміняється на дискові частини пам'яті, які, на його думку, є найменш ймовірними (доступна схема LRU)? Якщо так, чи не було б просто сенсом залишати все в оперативній пам’яті, і лише тоді, коли наблизиться до виснаження, тоді і лише потім поміняти частини LRU з оперативної пам’яті на обмінний простір?

Слід уточнити, у мого linux-сервера є 2 Гб оперативної пам’яті та 2 Гб місця підкачки.


1
чому 4 голоси, щоб закрити це питання?

2
@Aaron: Справа не в тому, що у вас погане питання. Ви просто сформулювали це з точки зору управління системою, щоб воно краще відповідало або споживачам енергії, або адміністраторам серверів. Те, що вам цікаво про це, як цікавість здається більше схожим на споживача потужності POV.

Відповіді:


11

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


7

Є сенс замінити речі заздалегідь, оскільки коли вам дійсно потрібна пам'ять, вам не доведеться чекати, поки ядро ​​закінчиться з доступом до диска.

Наприклад, скажімо, ви хочете відкрити велике зображення. Коли зображення завантажується, потрібно 300 Мб оперативної пам’яті. Якщо ядро ​​використовує всю оперативну пам'ять, яку він може, для завантаження зображення потрібно, щоб ядро ​​перенесло 200 МБ з ОЗУ на диск. Якщо вона попередньо спорожніла оперативну пам’ять, ви економите кілька мілісекунд.


7

2 причини:

  1. (@dtrosset) Linux замінить невикористані біти програм, щоб отримати більше кешу та буферів.
  2. Ви, можливо, використовували більше пам’яті в минулому і замінювали деякі речі, і це не замінювалось, тому що вони не були використані, хоча все, що витіснило його, тепер пішло.

1

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

Однак перенапруження пам'яті та побоювання вбивці OOM не є необхідною частиною досвіду Linux. Просто встановивши параметр sysctl vm / overcommit_memory на 2, вимикається поведінка перезаключення та постійно залишається вбивцею OOM. У більшості сучасних систем повинно бути достатньо місця на диску, щоб забезпечити достатній обмінний файл для більшості ситуацій. Замість того, щоб намагатися уберегти домашніх процесів від загибелі, коли закінчується перезавантажена пам'ять, може бути простіше просто уникнути ситуації. [ Відпочинок від вбивці ООМ ]

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

Оскільки процеси представлені власним адресним простором або "переглядом" (саме так працює своп в першу чергу), ядро ​​має багато свободи в тому, як це управляє. Використовуючи приклад вилки також із статті, зв'язаної вище, оскільки набагато більше шансів мати спільні сторінки пам’яті, ніж це для свіжого виділення великого обсягу невикористаної пам’яті, пам’яті можна виділити копіювати при записі, збільшуючи кількість використання підкачки. Коли це фактично записано в (що може не статися), то цей "здійснений своп" можна замінити будь-якою невикористаною оперативною пам'яттю (тоді збільшується використання оперативної пам'яті та зменшується використання swap). Уявіть собі процес з виділеним 500 Мб, який роздвоюється на машині з усією або майже всією оперативною пам’яттю. Якщо в swap доступно 500 Мб (а місця на диску дешево, наскільки 1% сьогоднішніх накопичувачів TB?: P), пам'ять не потрібно копіювати (поки що,

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

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

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