Як повністю відключити своп?


30

Я використовую sid Debian, жорсткий диск відформатований з ext4, працює на Linux 3.1

Я пам’ятаю про попередні версії Linux (можливо, до 3.0), якщо у мене не вистачає пам’яті, а своп не вмикається, програми зазвичай виходять з ладу. Це ідеально підходить для мого середовища: простий веб-перегляд без критичних операцій. Тобто, якщо я випадково натрапив на поганий веб-сайт, який використовує занадто багато пам’яті, він просто виходить з ладу, не роблячи мій термінал непридатним.

Але в моїй теперішній програмі комп'ютер зависає із сильною пропускною здатністю вводу / виводу на задньому плані. iotop виявляє винуватця kswapd0, а це означає, що це пов'язано з заміною. Після використання, swapon -sщоб визначити будь-які заміни, які було включено, я swapoff -aвідключив усі свопи і swapon -sзнову підтвердив, що всі заміни були відключені.

Тоді я знову спробував максимально використовувати пам'ять. На жаль, поведінки, якої я очікував, не відбулося. Натомість kswapd0 намагається знову і знову поміняти оперативну пам’ять і не вдається, оскільки місця для заміни немає. Оскільки він ніколи не здається, мій комп'ютер заблокований у вічній сильній заморожуванні вводу / виводу, що шкодить здоров’ю мого диска.

Чи роблю щось не так у спробі swapoff -a? Чому поведінка відрізняється від колишньої (ймовірно, до 3,0 разів)?


Це насправді не має сенсу. Якщо зробити swapoff -a сам , якщо в свопі були речі, буде генеруватися багато вводу-виводу (і це може призвести до загибелі процесів, якщо недостатньо реальної оперативної пам'яті). Ви впевнені, що це не те, swapoff -aщо спричинило "шторм" вводу / виводу?
Мат

1
Я вважаю, що досить прокоментувати fstabрядок про своп. Спробуйте, якщо поведінка однакова.
enzotib

@Mat swapoff -aповинен відключити swap назавжди, це означає, що він повинен бути відключений після наступної перезавантаження. Я це підтвердив. Тим не менш, "шторм" вводу / виводу все ж відбувається під час сеансу після наступного перезавантаження. Для запису, "шторм" вводу / виводу не відбувся в той момент, коли я це зробив, swapoff -aоскільки своп був на той момент 0.
syockit

9
@syockit: неswapoff -a є постійним.
Мат

1
Завантаження бази даних досягло приблизно 15% за 14 годин. Вимкнувся своп, і при наступній спробі він отримав 40% за 4 години. правда, сервер не працює та працює на ram, але без включеного свопу OpenSuSE працює набагато швидше для цього одного процесу. Думка ОС "кращого" і мого різко різняться під час простого завантаження mysql db. прокоментував своп-диск у / etc / fstab та перезавантажився.
TheSatinKnight

Відповіді:


15

Відключення swap не буде робити те, що ви хочете. Ви все одно отримаєте жорстоку пропускну здатність вводу / виводу, але це буде чистими сторінками, а не брудними.

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

Коли у вас не вистачає фізичної пам'яті, кожен процес повинен буде завантажувати свої кодові сторінки з диска, коли він вилучає попередні кодові сторінки. Результатом стане насильницький обман і надмірна робота, виконана підсистемою своп.

Це особливий випадок дуже важливого принципу: Для добре розробленої системи ви не можете зробити її краще, зменшивши свій вибір. Linux - це добре розроблена система. Видалення свопу просто дає менший вибір, тому не дивно, що він поводиться гірше.


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

1
Не вистачає всієї пам'яті, майже завжди буде виділено. Linux спеціально налаштований таким чином. Виконайте cat /proc/meminfoбудь-яке типове поле Linux через кілька годин завантаження.
Девід Шварц

2
@syockit Якщо ви вимкнете підкачку, ви не можете запускати жодну програму. Пейджинг - це механізм, за допомогою якого читаються файли, коли вони відображаються в пам'яті.
Девід Шварц

2
@psusi: чисті сторінки не будуть зведені до мінімуму, коли ви здійснюєте своп. Натомість він замінить брудні, анонімні сторінки, які нещодавно не використовувалися. Звичайно, в будь-якому випадку ви отримаєте жорстокий молоток, якщо робочий набір перевищить фізичну пам'ять. Справа в тому, що з підміном або без нього ви отримаєте багато насильницького молотья, перш ніж фактично не вистачить пам’яті. Різниця полягає в тому, що при свопі замінятимуться насильницькі трембіння (брудні сторінки, пишіть і читайте). Без свопінгу насильницький обмолот буде несправним кодом (чисті сторінки, лише читання).
Девід Шварц

2
@psusi: Ви маєте рацію, якщо стурбованість - це утікаючий процес, який швидко вибухає в споживанні пам'яті. Але це не те, про що йдеться в ОП, це процес, що вимагає надмірної, але не необмеженої або масово надмірної пам'яті. Коли він росте через велике солодке пляма (куди стискається кеш), він буде рости все повільніше і повільніше, коли система тремтить.
Девід Шварц

13

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

(ulimit -d 400000; firefox) &

Кількість після -d - у кілобайтах. Ви повинні експериментувати з цим у своїй системі, щоб вибрати найкраще значення для своїх звичок перегляду. В дужках створюється підзаголовок; команда ulimit впливає лише на цю оболонку та її дітей, ізолюючи її ефекти від батьківської оболонки.


Чи буде це працювати для хрому, скажімо, де ми маємо купу chromiumпроцесів, використовуючи невеликі шматки пам’яті?
jberryman

@jberryman Ні, обмеження пам'яті залежать від процесу, а не від користувача.
Кайл Джонс

Чи є спосіб надіслати йому вказаний сигнал (наприклад, SIGHUP), коли він досягне межі пам'яті?
Геремія

1
@Geremia Ні. Система brk і sbrk припиняє роботу, що змусить більшість речей згортатися і вмирати.
Кайл Джонс

Якщо ви хочете скористатися ручною настройкою, я б запропонував використовувати cgroup пам'яті замість ulimit, оскільки за допомогою cgroup memory ви можете встановити ліміт для всієї групи процесів, а також можна налаштувати процес розподілу пам'яті для зупинки, і ваш режим політики в режимі користувача може вирішити, що робити робити (наприклад, надсилати деякі сигнали, вибирати процес для вбивства, піднімати ліміт пам’яті на льоту). Докладніше дивіться на kernel.org/doc/Documentation/cgroup-v1/memory.txt та kernel.org/doc/Documentation/cgroup-v2.txt .
Мікко Ранталайнен

4

Щоб переконатися, що swap не використовується, вам краще запобігти додавання будь-яких свопів під час завантаження. Це можна зробити, залежно від системи, відключивши swapзавантажувальну службу або просто прокоментувавши запис своп /etc/fstab.

Що стосується вашого призупинення, то stop()функція /etc/init.d/swapможе давати підказку:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Зверніть увагу на тупик . Ви можете спробувати зробити umount -a -t tmpfsсебе, перш ніж вимкнути своп.


Редагувати:

Можливо, ви також можете досягти своєї мети, змінивши sysctlналаштування (див. Це питання ).


Я не маю swapв init.d, ні у мене його fstab, але у мене є , /etc/init.d/mountoverflowtmpщо кріплення tmpfsдля запису аварійного журналу. Чи використовується і демоном своп tmpfs?
syockit

Можливо, ви це ввімкнули в іншому місці - зробіть, grep -RF swap /etc/якщо хочете знайти. Але щоб відключити послугу, ви використовували б команду типу service(IIRC; сам Debian не використовую).
rozcietrzewiacz

1
Сам своп не використовує tmpfs , тому що tmpfsце файлова система в пам'яті (RAM). Але інші послуги / програми, які використовують, tmpfsможуть покладатися на своп по-особливому. Я насправді не знаю, але це може мати щось спільне з кешуванням або особливим способом, коли tmpfsводій вимагає доступу до місця обміну.
rozcietrzewiacz

Існує щось про те, як Linux обробляє віртуальну пам'ять, яку я не розумію. Я відключив swap найбільш можливими способами: через swapoffі через vm.swappiness=0. І kswapd0все-таки біжить! Цікаво, чи це регресія на 2,4 дня…
syockit

5
@syockit Очікувана поведінка. Система все ще обмінює чисті сторінки (сторінки, які містять копії файлових даних). Для обміну чистими сторінками не потрібно місця для обміну, оскільки вони можуть бути прочитані назад з інших джерел, ніж заміни.
Девід Шварц

2

Краще коментувати запис swap-розділу, /etc/fstabніж працювати swapoff -aпісля кожного завантаження.

У мене така ж проблема з kswapd0 на моєму обладнанні.

Налаштування vm.swappinessПараметр системи для мене не допомагає.

sysctl -w vm.swappiness=0

Я гуглив і читав багато дописів, списків розсилки, і тепер думаю, що це помилка ядра.

Коли немає активного swap-розділу, а вільної пам’яті стає менше, ніж деякий поріг (у моєму випадку близько 300 Мб), система стає невідповідною через безумство kswapd0.

Ймовірно, це відтворено з особливою конфігурацією та умовами.

Для когось це вирішується шляхом перевстановлення системи з перерозподілом для інших шляхом побудови користувальницького ядра з kswapd0відключеним.


2
Якщо kswapd0божевільний і у вас немає активованого підключення, ви поза оперативною пам’яттю. Ваш вибір - OOM Killer або kswapd0. Linux йде з kswapd0тим, що ядро ​​припускає, що важливіше закінчувати повільно, ніж припиняти процес. Для випадкових людей поріг, де ядро ​​вважає, що достатній прогрес уперед все ще відбувається, є вже льодовиково повільним, і майже ніхто не хотів би обрати вбивцю МОМ.
Мікко Ранталайнен

1

У своїй системі (debian sid 2016-11-15) я зробив це:

  1. вимкнути своп зараз:

    swapoff -a
    
  2. коментуйте рядок своп-розділом в / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. відключити монтаж swap у systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Це було б достатньо. Тут є посилання на /etc/initramfs-tools/conf.d/resumeфайл swap . Я не знаю, яка мета цього. Можливо, цей файл буде проблемою при наступному перезавантаженні (я ще не намагаюся перезавантажувати, час моєї роботи є дорогоцінним;)).


1

комп'ютер висить із сильною пропускною здатністю вводу / виводу у фоновому режимі. iotop виявляє винуватця kswapd0

Я знайшов один із способів (поки що) уникнути цього. Якщо ви хочете перевірити його і побачити, як це відбувається у вашій системі, дивіться патч ядра всередині цього питання . В основному, він не вилучає Active(file)сторінки (принаймні), коли знаходиться під тиском пам’яті, таким чином обрив диска (постійне зчитування) зводиться майже до нічого, а OOM-кілеру дозволяється спрацьовувати протягом 1 секунди, замість того, щоб заморожувати ОС для того, що здається як постійно (або принаймні протягом багатьох хвилин). Я сподіваюся, що фактичні програмісти (яких я не є) вдосконалять патч і перетворюють його на фактичне рішення, тепер, коли вони бачать, що те, що він робить, працює в цих ситуаціях.


цей патч ядра вже є основним?
humanityANDpeace

@humanityANDpeace, мабуть, ні, тому що це не так добре (так як я не програміст), проте я зіткнувся з деякими проблемами, такими як: іноді, залежно від завантаженості, за допомогою цього патча ви можете втратити пам'ять у випадках в якому без цього патча у вас не було б, і, таким чином, OOM-вбивця вб'є Xorg і xfwm4, БІЛЬШЕ я запускаю, echo 1 | sudo tee /proc/sys/vm/drop_cachesколи Active(file):(of / proc / meminfo) перевищує 2 Гб (у системі 16G оперативної пам'яті) - це може перейти до максимуму 4G
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.