Скільки SWAP ви б дали встановити CentOS на подвійний Quad Core XEON з 16 ГБ оперативної пам’яті, який буде запускати веб-сайт php з mysql backkend - середнє / велике навантаження?
Скільки SWAP ви б дали встановити CentOS на подвійний Quad Core XEON з 16 ГБ оперативної пам’яті, який буде запускати веб-сайт php з mysql backkend - середнє / велике навантаження?
Відповіді:
Не більше, ніж концерт або два - ви хочете трохи помінятися, про всяк випадок і тому, що це допомагає дещо краще працювати, але якщо ви коли-небудь дістанетесь до того, коли ви сильно міняєте, машина працює бути марним - і в реальній катастрофічній ситуації вам насправді краще з меншим простором обміну, адже тоді ви швидше, ніж пізніше ви спрацьовуєте на вбивцю OOM.
Прошу вибачення за дуже довгу відповідь. Я хотів би на деякий час поставити цей матеріал десь доступним!
TLDR; Теоретично кажучи, відповідь буде "ймовірно, не менше загальної кількості пам'яті резидента, яку всі ваші програми хочуть використовувати"
Я спробую пояснити, якщо ти залишишся зі мною ..
Трохи про віртуальну пам'ять
Я відчуваю, що в наші дні існує поширене неправильне уявлення про значення суапу і для чого його мета. Часто вважають, що своп означає "резервний банк" для пам'яті, коли у вас мало пам'яті. Так, це частково так, але ядро не хоче використовувати ваш своп як резервний банк . Крім того, ядро ніколи не хоче викликати диск, щоб отримати дані, які ви шукаєте!
У просторі додатків є декілька речей, які ядро зберігатиме в пам'яті.
З метою управління пам'яттю розподіл пам’яті підтримується в тій чи іншій формі підтримуючим пристроєм.
Запам’ятована файлом пам’ять - це пам’ять, яка вийшла з файлу і на типовому O / S складає переважну більшість розподілу пам’яті в системі. Він включає такі файли, як завантажені бібліотеки, які завантажуються, файли, зчитувані з диска і зберігаються в кеші сторінки, і файли, зібрані з диска (насправді, ядро не розрізняє сторінки між файлами в кеш-сторінки і файлами, що позначаються як їх по суті Те ж саме).
Чудова річ у цій пам’яті з точки зору ядра - це її одноразове користування, тобто вона повинна мати можливість скинути ці сторінки, якщо вам потрібна пам’ять для чогось іншого, і саме це робить кеш сторінок, якщо раптом пам’ять є потребою.
Анонімно підтримувана пам'ять - інша справа. Пам'ять з цього регіону є анонімною, тому що на диску немає файлу, який насправді містить ці дані. Зазвичай це складається з стека додатків, купи, нічого в tmpfs та mmapped даних, які є приватними та змінені (оскільки він не може синхронізувати цей матеріал назад на диск). Оскільки у файловій системі просто не існує дійсного файлу, на який можна записати ці сторінки, якщо вони змінюються, анонімно збережена пам'ять підтримується носієм своп.
Тепер ядро знає, що, коли пам'яті дефіцитно, її набагато дешевше виривати файли з резервною пам'яттю анонімно відображеної пам’яті, ось тому, що анонімні дані мають набагато більший шанс бути «брудними», ніж дані, захищені файлом, насправді ядро за замовчуванням. оцінює анонімно резервну пам’ять як 80 разів більшу цінність, ніж пам'ять, що підтримується файлами, і це насправді те, що модифікатор затишності робить у Linux (див. цю публікацію тут, якщо ви хочете знати, що саме змінює параметр zamppiness).
Найгірший сценарій
Найгірший сценарій, коли мова заходить про те, що сервер виходить з-під контролю та OOMing, ґрунтується на тому, що він витрачає набагато більше часу на обробку запитів вводу-виводу, ніж на задоволення запитів на розподіл пам'яті. Є дві умови, які можуть посилатися на цей критерій.
Перший - це поширена думка про проблему. Тобто, оскільки стільки пам’яті живе всередині swap, потрібно поміняти анонімну пам'ять з оперативної пам’яті, повернути її в swap, а потім взяти щось із swap і помістити в реальну оперативну пам’ять. Ця операція є дуже дорогою, сповільнюючи роботу машини до того моменту, коли вона може стати нерозв’язною ситуацією (оскільки більше запитів ставиться в чергу для потреб сторінок, ніж те, що можна подати з вводу / виводу).
Другий - менш розглянутий, але не менш важливий. Якщо ви виділите майже всю свою пам'ять на реальні дані програми - ви не будете тривати довго. Практично кожна програма покладається на читання файлів з файлової системи для роботи, це може бути тому, що деякі інструкції живуть у спільній бібліотеці або тому, що вам потрібно прочитати /etc/resolv.conf для виклику бібліотеки чи будь-якої іншої мети. Це повністю правдоподібно, щоб зупинити операційну систему - все ж мати достатньо пам’яті, щоб вмістити всі ваші програми, але оскільки ваша черга на стільки запитів вводу / виводу нічого не має шансів виконати належним чином.
Що ядро хоче зробити з вашим свопом
Ядро хоче використати ваш своп, щоб позбутися сторінок, які витрачають пам'ять, щоб воно могло використовувати цю пам'ять для чогось іншого.
В основному, в звичайному режимі, ядро любить агресивно заповнювати кеш сторінок даними, прочитаними з диска, це означає, що він не буде читати диск для тих же даних. Це хороший дизайн і може масово зменшити введення / виведення. Тепер, можливо, у вас є приклад, який сидів у пам'яті, який спить 3 дні, прокидається, робить купу роботи, а потім спить ще 3 дні.
Що ядро хотіло б зробити з цими даними - це поміняти його, щоб замість цього зробити місце для діяльності файлової системи, оскільки у вас набагато більший шанс фактично використовувати ці сторінки частіше, ніж сторінки, які ви використовуєте для свого додатка. У цьому сенсі можна поміняти обмін транзакціями 16 кбіт на ваш носій своп, який ви навряд чи відчуєте, але взамін ви звільнили пам'ять 16 Кбіт, яка могла бути використана для зберігання чотирьох файлів, варті даних.
Для чого ядро не хоче використовувати swap
Ядро напевно не хоче використовувати свій swap для виділення більше анонімної пам’яті, заміняючи якусь іншу анонімну пам’ять, це ситуація, про яку люди хвилюються найбільше і правильно.
Однак я повинен зазначити, що якщо у вас виділено стільки пам’яті, що у ядра немає іншого вибору, крім цього, це проблема конфігурації системних адміністраторів, а не самого ядра - його просто намагаються зробити найкраще Варіанти, які Ви дали!
Якщо у вас є величезна кількість свопів, чи збільшуєте ви шанс використовувати його?
Ні! Якщо у вас є 1G оперативної пам’яті та 4G свопу, це не на 80% шансів, що ваші дані будуть замінені! Ядро хоче використовувати своп лише тоді, коли сторінки в пам'яті можна краще обслуговувати, роблячи щось інше!
Чи вигідно взагалі не використовувати своп
Я б ніколи цього не робив. Заміна дозволяє O / S позбутися пам'яті, яку вам потрібно мати, але ніколи не використовується. Якщо у вас немає підкачки, ви просто не проганяєте пам’ять, яку ви ніколи не повернете, і для цього, можливо, ви побачите значне поліпшення продуктивності, дозволяючи, скажімо, кешувати сторінку замість неї.
Що найкраще мати своп
Теоретично кажучи, з’ясуйте, скільки пам'яті резидента + 20% на безпеку, наприклад, дзвінки з бібліотеки, що повторно вступають, яким потрібно виділити пам'ять з купи - тоді встановіть свій своп на цю кількість. Це (теоретично так чи інакше) дозволить операційній системі витіснити всю анонімну пам'ять, якби довелося створити місце для чогось більш корисного.
Якщо я отримаю можливість ядра поміняти все небезпечне, чи не так?
Пам'ятайте, що ядро не хоче обмінятися, щоб створити місце для більш анонімного розподілу пам’яті тут, воно буде лише коли-небудь міняти сторінки, які не використовуються, для переваги чогось іншого, що дозволить краще використовувати простір.
Якщо ваша заміна анонімної пам’яті не лише для виділення з анонімної пам'яті, ви робите щось не так, і вам потрібно більше оперативної пам’яті або все одно переробляти стек додатків.
Скільки оперативної пам'яті вам знадобиться
Вам потрібно дозволити достатню кількість оперативної пам’яті, щоб запустити всі ваші програми, звичайно, але ви, мабуть, повинні дозволити додаткові 2G оперативної пам’яті, щоб заповнити кеш сторінки - можливо, і більше. Кеш сторінки робить ваш комп'ютер набагато швидшим, а ваші диски довше. Якщо ви думаєте про запуск веб-сервера, маючи ще більше для кеш-сторінки, це гарна ідея завдяки великій кількості статичного вмісту, який ви можете отримати та використати з кеш-сторінок, який би вийшов у службу (якщо пропускна здатність вашого веб-сервера 5 Мб / с, ви дійсно не працюєте Ви хочете отримати той вміст 5 Мб / с, який ви генеруєте з диска!
Що робити, якщо ви дійсно не довіряєте Linux, щоб правильно міняти місцями
Якщо ви дійсно стурбовані, ви можете виділити більше пам'яті, ніж у вас є:
Що найкращий спосіб налаштувати мою пам'ять для мого застосування
Постачальник рекомендує іншу конфігурацію ..
Слухайте це замість цього. Деякі програми написані таким чином, що вони навмисно викликають ядро, щоб активувати його сторінки над усіма іншими. Це неприємний трюк, якщо чесно, але він порушує здатність ядер до безперебійного управління пам’яттю, коли це відбувається. Якщо ваш постачальник надає вам конкретні дані, вони, ймовірно, потрапляють до цієї категорії і слухають, що вони говорять натомість.
Підводячи підсумок
Ядро, як правило, робить дуже хорошу роботу з належного керування віртуальною пам'яттю. Практично завжди буває так, що ваша програма виділяє більше пам’яті, ніж ви могли б сподіватися на роботу, і ось що викликає OOM.
Swap використовувався як "запасна пам'ять", але це вже не є його основною метою, тому не думайте використовувати його так. Натомість оцініть, що ваше ядро, ймовірно, найкраще знає, для чого хоче використовувати вашу пам’ять. Дайте йому простір для прийняття цих рішень, і ви отримаєте користь від загального підвищення ефективності.
З документа "Сервер Oracle 10g на Red Hat® Enterprise Linux® 5 рекомендацій щодо розгортання".
Oracle надає загальні рекомендації щодо розміру свопу в MetaLink Note 169706.1. Ці рекомендації можуть призвести до створення дуже великого місця обміну в системах з великим обсягом пам'яті. Дуже великий своп може призвести до погіршення продуктивності системи і може бути усунений за рахунок зменшення місця заміни. Red Hat не рекомендує виділяти більше 4 Гб для своп на Red Hat Enterprise Linux 5.
Таким чином, для 16 Гб у вас має бути не більше 4 Гб свопу.
PS. Також варто зазначити, що викликається oom
майже завжди краще, ніж непридатний процес заміни, використовуючи всю пропускну здатність вводу / виводу.
Поточні рекомендації CentOS Swap використовують формулу:
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
Отже, для 16G кількість свопів має бути 18G.
Див. Http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
З того, що я пам'ятаю з документації на Linux: Якщо ваш RAM більше 2 Гб, то ви робите swap = (ramSize + 2). Якщо менше, то робиш swap = (ramSize * 2)
Я знайшов цей документ для вас, він повинен допомогти вам прийняти це рішення, ось він: Що таке Swap Space? , але жоден із наведених відповідей не є правильним
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file