Linux: як явно відмінити все можливе?


59

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

Чи є спосіб явно перенести все можливе - від swap назад до оперативної пам’яті? А може, не все, а лише деякі конкретні обробляють дані?

Відповіді:


59

Я рекомендую дозволити звичайний обмін пам’яттю управління оперативною пам'яттю на речі, які фактично використовуються, як вони використовуються.

Єдине, що я можу придумати - це вимкнути своп, а потім знову ввімкнути

sudo swapoff -a
sudo swapon -a

Це передбачає, що у вас є достатня запасна фізична пам’ять, щоб містити все під заміну ...


4
Це працює, хоча дуже повільно :) Дякую! Але все ж я вважаю, що є більш елегантне рішення :)
kolypto

7
Обережно з цим рішенням, воно буде вимушено витягувати все ... якщо воно не відповідає фізичній пам'яті, ядро ​​запустить смертельний вбивця OOM. Я не знаю жодної приємної команди "спробуйте перенести все в оперативну пам'ять, але вийти з ладу витончено, якщо не можливо".
Джуліано

1
Я спробував це і дізнався, що він працює дуже повільно. Тож можливо стежити за вільною оперативною пам’яттю та вбивати, swapoffякщо пам’ять
знизиться

2
Я не впевнений, що вбивство заміни фактично зупинить операцію. Залежить, як це реалізовано.
Дуглас Лідер

2
Здається, що команда swapoff виконує щось на кшталт "не дозволяти міняти нові записи", тоді як будь-який інший запущений процес (який був / використовується swap) все ще може "випустити swap". Це може бути, чому, здається, йде так повільно. Це, мабуть, не спричиняє використання OOM, як сказала інша людина (я використовую Ubuntu Bionic) - ймовірно, що це буде лише тоді, коли "додаткові (або існуючі) процеси почнуть використовувати нову пам'ять" (тобто реальні OOM). Таким чином, все в цілому swapoff / swapon - це чудове рішення, як здається. Ніжний / стійкий. Це передбачає, що ви не ініціюєте більше пам’яті за допомогою процесів (або збільшуєте споживання в запущених).
Roel Van de Paar

12

Ви можете налаштувати його, повторюючи деяку кількість від 0 до 100 в /proc/sys/vm/swappiness.

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

Значення за замовчуванням - 60.


13
Не використовуйте / proc / sys безпосередньо, скористайтеся sysctlкомандою. У цьому випадку це так sysctl vm.swappiness=x.
Джуліано

7
Я не думаю, що навіть заміщення нуля призведе до того, що сторінки, які вже розміщені, будуть явно введені в основну пам'ять?
Дуглас Лідер

1
@Douglas має рацію. vm.swappiness в основному контролюватиме рішення про те, чи потрібно переміщувати речі для заміни чи зменшення кількості кеш-пам'яті та буферів, коли вимагається пам'ять.
Джуліано

@Juliano, чому не слід використовувати / proc / sys?
Джеймс

@James Оскільки / proc / sys - це інтерфейс нижнього рівня, який використовується для зміни та запиту конфігурації ядра (це "деталі реалізації"). Linux надає команду вищого рівня sysctlдля взаємодії з користувачем. Кінцевий результат той самий, але зазвичай інтерфейси вищого рівня бажані для взаємодії користувача безпосередньо. Як би запустити двигун за допомогою короткого замикання проводів запалювання (нижній рівень), а не просто повороту ключа (більш високий рівень).
Джуліано

5

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

Що ви запустили, що так голодна пам’ять? Чи можна це настроїти? Якщо у нього немає своїх власних директив щодо обмеження пам’яті, ви також можете поглянути на ulimit.


У моєму випадку це було convert -density 200 file.pdf jpegs/file.jpg. Чомусь він використовує багато пам’яті, але ти маєш рацію: його можна настроїти. Так чи інакше, ситуація можлива з будь-яким додатком :)
kolypto

1
Я погоджуюся з цією відповіддю - ви, ймовірно, повинні залишити звичайні операції на машині, щоб помінятися тим, що насправді потрібно.
Дуглас Лідер

convertмає -limitаргумент для управління пам’яттю та використанням диска, і вам слід прочитати на них. Установка -limit memory 512MBчи подібне було б добре. Напевно, також було б добре вказати явний MAGICK_TEMPORARY_PATH і очистити це після виконання вашої команди.
шипіння

3

Якщо у вас є пам’ять, доступна для всіх ваших програм, нормально встановити своість на 0, так що речі не заміняться. Наприклад, qemu-kvm є великою ціллю VMM, яку можна замінити, оскільки вона "здається" простоює більшу частину часу. Я бачу, що до 80% пам'яті пам’яті qemu-kvm записуються на своп. Відеомагнітофони, що працюють у qemu-kvm, стануть майже невідповідними, оскільки у них закінчується своп (хоча гість не здогадується, що це відбувається). Гість VM подумає, що працює найкраще, хоча, по правді, дуже тягнеться. Коли я купу візуальних машин «прокидаюся» і починаю займатися, це може спричинити середнє завантаження до понад 30, навіть на апаратному рівні підприємства з достатньою швидкою пам'яттю та диском. Я думаю, що це невдача в дизайні qemu-kvm, який випускається поза коробкою.

Сподіваюся, що це комусь допоможе.


Боюся, це не зовсім точно.
23

2

Я б радив не намагатися переосмислити підсистему VM в ядрі. Навряд чи у вас є достатньо інформації для прийняття кращих рішень, ніж це буде. І якщо ви змусите її якось зробити неправильну справу, то ви просто в кінцевому підсумку зробите все ще повільніше.


9
Є деякі випадки, коли я хочу робити те, що хоче ОП. Якщо я випадково дозволю процесу запускати бут і зайняти всю свою оперативну пам'ять + своп, то я можу або зачекати 15 секунд кожного разу, коли я перемикаю програми, щоб пам'ять виходила з підкачки, або просто примушувала її і змушувала все працювати так швидко, як зазвичай.
Олексій

1

Якщо ви зможете перезавантажити систему, яка повинна це зробити (і це може зайняти набагато менше часу, ніж спроба будь-якого іншого рішення).


1

Скопіювати частину моєї відповіді з цього питання .

Так що ви знаєте, як працює перенастроєність. Це працює, повідомляючи підсистемі VM шукати сторінки для обміну, коли% пам'яті, відображеної на таблиці сторінок обробки + значення заміщення становить> 100. Таким чином, встановлення 60 призведе до того, що система почне видаляти застарілі сторінки з таблиці процесної сторінки коли він використовує більше 40% пам'яті вашої системи. Якщо ви хочете дозволити вашим програмам використовувати більше пам’яті за рахунок кешу, ви хочете знизити значення заміщення.


Я не думаю, що тут є проблема пам’яті програми та кеша - я думаю, що це пам’ять додатків проти невикористаної пам’яті. І я не думаю, що заміщення вплине на це.
Дуглас Лідер

0

Процес все ще працює? Відкрийте термінал і подивіться, чи зможете ви помітити запущений процес. (ps aux | grep processname може зробити це трохи простіше) Використовуйте kill -9 PID, щоб знищити їх, якщо вони все ще запущені. Будьте уважні до того, що ви вб'єте. Якщо ви не знаєте, що таке процес, не вбивайте його! Крім того, розмістіть вихід free -m, щоб ми побачили, чи дійсно ви все ще використовуєте багато свопів.

Якщо все ще триває повільно, у вас все ще може працювати все, що ви запустили. Я б ніколи не вмикав своп, якщо ви справді не знаєте, що робите, або вам подобається жити на краю. =)


0

Я вважаю, що немає жодного дійсно хорошого способу змусити Linux відміняти дані з диска на пам'ять. Коли swapoff / swapon є робочим рішенням, але він брудний і легко може зробити вашу систему нестабільною. У випадках, коли у вас більше даних у свопі, ніж вільної пам'яті, важко уявити будь-яку ефективну політику, яку може використовувати Linux, щоб вирішити, які фрагменти даних рухаються в пам'ять і які частини зберігаються на диску.

Підсумок: Просто нехай Linux поступово відновлює свою ефективність у звичайному режимі. Його підсистема ВМ організована таким чином, що вона прагне і постійно переходить до якогось ідеального збалансованого стану.


-2

Випорожнення кешу буферів

Якщо ви хочете їх спорожнити, ви можете скористатися цим ланцюгом команд.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Ви можете сигналізувати ядро ​​Linux про відміну різних аспектів кешованих елементів, змінивши числовий аргумент на вищевказану команду.

ПРИМІТКА. Очистіть пам'ять непотрібних речей (ядро 2.6.16 або новіші). Завжди переконайтеся, що запускайте синхронізацію спочатку, щоб видалити корисні речі на диск !!!

  • Щоб звільнити кеш сторінок:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Щоб звільнити зубні сторони та введення:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Щоб звільнити кеш-пам'ять сторінок, стоматологічні системи та індекси:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Наведене вище покликане запускати як root. Якщо ви намагаєтеся робити їх за допомогою sudo, вам знадобиться трохи змінити синтаксис на щось подібне:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.