Управління пам’яттю в linux і openvz Colobridge WIKI
Продукти
Статті
Зміст
управління пам'яттю в linux та openvz
Застосування: Linux, OpenVZ Слова для пошуку: memory, limit
Стаття ще не завершена
Пам'ять – найважливіший ресурс сервера. Зазвичай адміністратори покладаються на базові параметри систем, передбачені розробниками, але нерідко цього недостатньо.
Від уміння адміністратора орієнтуватися в аспектах управління пам'яттю залежить продуктивність, стійкість, а нерідко і працездатність систем.
У цій статті я намагаюся спрощено і коротко викласти найважливіші для системного адміністратора моменти управління пам'яттю стосовно використання OpenVZ.
Для подробиць зверніться до відповідної документації.
Принципи роботи менеджера пам'яті в Linux докладно викладені на 768 сторінках книги Understanding the Linux Virtual Memory Manager (Крейда Горман) та в книзі Ядро Linux (Бовет, Чезаті).
Загальні засади роботи диспетчера пам'яті
Підсистема віртуальної пам'яті розподіляє пам'ять між завданнями (процесами). Кожне завдання (процес) вважає, що їй виділено безперервну ділянку пам'яті максимального розміру, що підтримується на відповідній архітектурі (для x86 архітектури це 4GB). З них один гігабайт (лише x86) резервується для ядра.
Основним засобом організації роботи операційної системи UNIX® (Linux) та одиницею багатозадачності єпроцес - унікальним чином ідентифікована програма, яка потребує отримання доступу до ресурсів комп'ютера. Процес є програмним кодом, яким маніпулює Операційна система. Операційна система координує роботу розділів даних процесу та визначає середовищевиконання.
Дані, пов'язані з процесом, є частиною образу процесу. Деякі їх зберігаються в регістрах, зазвичай представлених регістрами процесора. І існують динамічні області зберігання даних (купа), що виділяються процесу по ходу роботи за потреби.
Ще в процесу є стек, що міститься в пам'яті і використовується для зберігання локальних змінних програм і передачі параметрів. Коли процес виконує звернення до функції або підпрограми, у стек відправляється новий кадр. Однією з частин кожного кадру є покажчик на базу попереднього кадру, який дозволяє легко повернутися з функції виклику.
Кількість доступної пам'яті в Linux визначається сукупним значенням RAM + swap (простір підкачування на диску).
Насправді ж програма займає лише той обсяг пам'яті, з яким вона реально працює. Більшість пам'яті існує віртуально, але програма буде надана в той момент, коли вона звернеться в цю область.
Якщо вільних сторінок більше немає, але існує файл підкачки, куди ядро може прибрати одну з сторінок, що найбільше не використовувалися, і фізичну сторінку, що звільнилася, віддати запрошеному пам'ять процесу.
Якщо немає ні незайнятого простору у файлі підкачки, ні вільних сторінок RAM, то розвиток подій може бути наступним: або процес, що запросив пам'ять, перерваний і "вбитий" системою, або якийсь інший з процесів (це визначається специфічними алгоритмами) буде "вбитий" ядром , і звільнена пам'ять буде передана процесу, що запитав пам'ять.
Кількість пам'яті Linux визначається сукупним значенням RAM + swap. Пам'ять процесам виділяється з цього пулу у вигляді функцій мови *alloc() 1)
Пам'ять використовується ощадливо, але ядро намагаєтьсявикористовувати усю пам'ять, якщо пам'ять не зайнята процесами, то ядро використовує її під буферизацію (кешування) даних. Цінний ресурс не повинен бовтатися без діла.
Однак ядро дозволяє виділяти пам'яті більше, ніж RAM + swap. Така поведінка ядра називається перевиділення (overcommitting ) пам'яті. Як це можливо, без шкоди для стійкості? Наприклад, виконується деяка кількість процесів вебсервера apache. Приблизно 20-30% простору пам'яті виділеного кожному процесу apache зарезервована, але не використовується і тому може бути надана іншим процесам. Алгоритм цього простору може регулюватися параметрами ядра.
Параметри використання пам'яті можна побачити у файлах: