У мене хмарний сервер з ~ 14G оперативної пам’яті і без свопу. Однак я час від часу бачу kswapd0, що займає деякий процесор під час запуску top
. Чому kswapd0 взагалі працює, якщо у ньому немає місця для обміну?
У мене хмарний сервер з ~ 14G оперативної пам’яті і без свопу. Однак я час від часу бачу kswapd0, що займає деякий процесор під час запуску top
. Чому kswapd0 взагалі працює, якщо у ньому немає місця для обміну?
Відповіді:
У ньому ще є процес перевірки, чи є якісь заміни. Щоб зменшити його, вам потрібно буде встановити свою примхливість -
відредагувати "/etc/sysctl.conf" як корінь, а потім змінити (або додати)
vm.swappiness = 0
kswapd0
берете будь-який процесор, і у вас немає swap, система майже не має оперативної пам’яті і намагається впоратися з ситуацією шляхом (на практиці) заміни сторінок з виконуваних файлів. Правильне виправлення - зменшити навантаження, додати swap або (бажано) встановити більше оперативної пам’яті. Додавання swap підвищить продуктивність, тому що ядро матиме більше варіантів щодо того, що можна поміняти на диск. Без заміни ядро практично змушене змінювати код програми.
kswapd0
використовуєте деякий процесор, і ви цього не хочете, зменшіть swappiness
налаштування. Однак, якщо ваш своп не підтримується SSD, який страждає від запису (наприклад, поганий алгоритм вирівнювання зносу), зниження swappiness
знижує загальну продуктивність системи. Ідея полягає в тому, щоб зберегти копію оперативної пам’яті в свопі, якщо потрібна більше оперативної пам’яті - у такому випадку копія оперативної пам’яті буде негайно викинута замість того, щоб почати її обмінювати, перш ніж оперативна пам’ять може бути використана. Ця оптимістична заміна здійснюється лише тоді, коли система працює в режимі очікування, тому вона ніколи не повинна сповільнювати вашу систему.
Простір swap використовується лише для даних, які не підтримуються жодним іншим файлом. Дані, відображені з інших файлів на диску (наприклад, виконуваних програм), все ще переглядаються у відповідні файли, навіть якщо у вас немає пристрою для заміни.
Добре відома проблема того, що коли в Linux не вистачає пам'яті, він може вводити цикли заміни, а не робити те, що повинен робити, вбиваючи процеси, щоб звільнити оперативність. Є вбивця OOM (Out of Memory), який робить це, але тільки якщо Swap і ОЗУ заповнені.
Однак це насправді не повинно бути проблемою. Якщо є маса процесів, що порушують правопорушення, наприклад Firefox та Chrome, у кожному з яких є вкладки, які використовують і захоплюють пам'ять, то ці процеси спричинить своп зчитування назад. Потім Linux входить у цикл, де однакова пам'ять переміщується вперед і назад між пам'яттю та жорстким диском. Це, в свою чергу, викликає інверсію пріоритетів, коли заміна декількох процесів назад і назад робить систему невідповідною.
Якщо ви відключите swap, ви погіршите цю проблему, оскільки kswapd0 тепер не має іншого вибору, ніж поміняти зіставлену пам'ять, наприклад виконувану файли. Якщо ви поміняєте виконавчі файли, навіть більша ймовірність того, що вони будуть замінені знову досить швидко.
Я спробував викликати цю поведінку в NetBSD для тестування, і те, що там сталося, - це те, що процес порушника став неймовірно повільним, тоді як сама ОС була дуже чуйною. Це означає, що проблема з заміною все-таки виникає, але немає пріоритетної інверсії. Однак у NetBSD немає драйверів AMDGPU, тому я дотримуюся часу Linux. Можливо, NetBSD не виконує виконуваних файлів карти пам’яті, і саме тому він не вводить цикли swap, але я насправді недостатньо знаю про його реалізацію, щоб сказати, чому вона не стає безвідповідальною.
У Facebook була і ця проблема, і вона створила OOMD, який є демоном Out Of Memory. Це демон, який виявляє активність kswapd0 і починає вбивати процеси. За даними Facebook, це майже повністю усунуло проблему, коли Linux-сервери ставали невідповідними. Однак я не тестував його і не знаю, наскільки добре він буде працювати на інших серверах або настільних комп’ютерах / ноутбуках. Привабливо OOMD має певну логіку, яка визначає, які процеси вбити спочатку, щоб зберегти системні процеси та ту частину їх серверної системи, яка відповідає за повторний запуск того, що було вбито.
Однак це не так, як слід вирішувати. OOMD - це НЕГОЛОЖНА ХАК. Справжнє рішення полягає в тому, щоб виправити інверсію пріоритету, яку викликає цикл swap, а також зробити ядро OOM Killer більш агресивним при знищенні процесів, щоб звільнити пам'ять. Виправлення належить до ядра, тому що це єдине місце, де ми можемо бути впевнені, що проблема виявлена вчасно та процеси вбиваються належним чином.
Встановлення swappiness = 0 не є рішенням, оскільки коли система не має вільної оперативної пам’яті, вона починає змінюватися незалежно від того, що. Немає можливості гарантувати, що система не почне міняти місцями.
А також виправлення неприйнятних програм - це не виправлення. Особливо ні, якщо користувач хоче використати цю помилку, щоб навмисно зробити операційну систему невідповідною. Бути чуйним - це відповідальність ядра. Якщо Firefox не відповідає, то виправлення стосується програми. Однак це не тільки не реагує, але й спричиняє, що вся ОС стає дуже повільною і невідповідальною. До рівня, який може зайняти півгодини для входу в SSH. SSH не має нічого спільного, і якщо його не запустити, це помилка в ядрі, а не в будь-якій іншій частині системи. І це не помилка, це дві помилки. Один помилка - це інверсія пріоритету, коли цикл заміни рейки може втручатися в інші процеси, ніж порушення (-ів), і сам по собі це погано. Інша помилка полягає в тому, що вона не ' t виявити, що він знаходиться в циклі swap і що викликає божевільний знос на жорсткому диску / SSD або будь-якому сховищі, яке підтримує заміну. При заміні виконуваного файлу це менше проблеми, оскільки вони зчитуються лише картами пам'яті, які не записуються на диски, але kswapd0 все одно блокується, читаючи назад те, що воно одночасно видаляється з пам'яті.
Ох, і є третя помилка. Справа в тому, що немає ніякого способу захистити диск CACHE від вживання в їжу, коли голодні програми пам'яті проковтують всю наявну пам'ять. Це одна з причин того, що kswapd0 робить систему невідповідною. Найбільш гарячі дані, відображені в пам'яті, зазвичай зберігаються в кеш-пам'яті диска, але коли Firefox з'їв цей кеш, це очевидно означає, що повинні відбуватися читання дисків.
Не обов'язково Firefox викликає вашу проблему, але це браузер за замовчуванням, а не Chrome. І те, і інше, як відомо, викликає цю проблему, оскільки вони розглядають наявну пам'ять як щось, що витрачається на максимум, включаючи кеш-пам'ять та обмін пам’яттю, які в Linux вважаються "доступною пам'яттю". Тому, щоб не отримати "доступну пам'ять", витрачайте її даремно, використовуйте її для кешування та інших речей. Очевидно, що використання SWAP для DISK CACHE - ДУЖЕ БАДА ІДЕЯ, але хлопці з Firefox та Chrome відповідають на це за допомогою "вільної пам'яті витрачається на пам'ять".
Отже, у нас є три помилки ядра, які, здається, команда ядра не вважають помилками. І помилка у Firefox, Chrome та всіх похідних, які вони не вважають помилкою. Я спробував побудувати Firefox на своєму ноутбуці Fedora, щоб розглянути цю проблему і, можливо, її виправити. Вгадай що. Побудова Firefox з GCC на 4-х ядерному процесорі з 4 ГБ оперативної пам’яті запускає SWAP LOOP з ПРІОРИТЕТНІМ ІНВЕРСІЄЮ. Отже, одна з програм, яку потрібно переписати, - це GCC. У NetBSD те, що відбувається - це лише 4 запущені екземпляри GCC повільніше, ніж запуск одного екземпляра, але він не заморожує систему.
Так, це трохи невдоволено, але я сподіваюся, що це прояснить поточну проблему з підсистемами пам’яті Linux, а також програмами, які її викликають.
Якщо у вас немає заміни та kswapd0
працює, ваша система фактично використовує майже всю оперативну пам’ять на той момент. Настав час отримати кращі інструменти для моніторингу використання пам'яті (або вільної / доступної пам'яті в системі).
Справжнє виправлення полягає у зменшенні обсягу використання пам'яті (запустіть процеси з меншими витоками пам’яті, запускайте менше процесів, пропускайте запущені деякі процеси, обмежте кількість дітей / робочих процесів деякого серверного програмного забезпечення) або отримати більше оперативної пам’яті. Якщо потреба в оперативній пам’яті викликана витоком пам’яті, ви можете замість цього використати своп. Linux має бути досить розумним, щоб деталі, що протікали, міняли обмін даним часом. Заміняти місцями краще, ніж нічого, але це не є реальною заміною наявності достатньої кількості оперативної пам’яті.