Повітряна куля в ОС


13

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

Чи можливо реалізувати на рівні ОС для процесів (я в основному думав про дублювання пам'яті під час перегляду Chromium з декількома вкладками на одному і тому ж сайті), це вже було реалізовано?

Відповіді:


14

Насправді, те, що ви описали, плутає повітряну кулю та «з’єднання однієї сторінки». Я спробую детальніше розібратися над двома, щоб зробити розрізнення очевидним.

Повітряна куля

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

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

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

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

Об’єднання однієї сторінки

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

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

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

Саме тому він може час від часу сканувати всю систему ідентичних сторінок пам'яті - велика частина часу, вони будуть ідентичні по гостьовій ОС, а не в кожних з них - гість ядро робить пристойну роботу по збереженню пам'яті акуратною в межах свого діапазону. Таким чином, у типовому середовищі VM, де одне ядро ​​хоста обслуговує 50+ гостей, економія пам’яті може бути досить значною.

Обидва одразу

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


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

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

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

Це відрізняється в мобільних системах. Наприклад, в Android широко використовується KSM, щоб виводити однаковий код між різними програмами.

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

https://www.kernel.org/doc/Documentation/vm/ksm.txt


3
Злиття на одній сторінці також називається «трансцендентною пам’яттю», залежно від гіпервізора (та віку його).
Тім Пост

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

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

Сирі сценарії відображаються на карті, але навіть загальні сценарії (наприклад, jQuery та Angular.js) реплікуються в кеш-пам'яті, і вони не узгоджуються один з одним, оскільки існує велике використання CDN та точних реплік файлів сценаріїв на різних серверах сайту.

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