У мене стандартний ноутбук для Linux (тестування Debian), з розділом swap.
Я роблю з цим багато експериментів. Деякі з них справді голодні по пам'яті, і те, як Linux веде себе за замовчуванням, є проблемою для мене ... Наведемо дурний приклад:
- Сядьте перед ноутбуком
- Відкрийте термінал
- Введіть
python
, тодіa = [0]*100000000
Зараз великі шанси, що у вас не вистачить оперативної пам’яті, щоб обробити цей великий список. Linux заповнить оперативну пам’ять, потім поміняється свопом, і через пару хвилин вбивця OOM буде спрацьовано і вб'є (майже) випадкові сервіси і, сподіваємось, якщо ви вчасно натиснете Ctrl + C python
, і якщо термінал як і раніше фокус, комп'ютер знову стане чуйним.
Я хотів би застосувати деякі обмеження пам'яті, щоб уникнути небажаної заміни та відмовитись від процесу на виділення більше пам'яті, ніж у мене (в оперативній пам'яті). Якщо потреба в пам'яті знаходиться нижче певної межі або запитується коренем, то просто вбийте самий голодний процес будь-якого користувача, крім root.
ulimit -Sv [mem]
Я чую ззаду!
Хо-хо! "Використовуйте cgroups
через cgexec
!" хтось каже в першому ряду!
Так, ви праві: це дійсно дуже хороші рішення. Але:
- Вони не застосовуються у загальній системі
- Ліміти встановлюються на процес
- Ліміти є статичними, не враховуючи реальну кількість вільної оперативної пам’яті (AFAIK)
- Тут і там вони кажуть, що це не дуже вдале рішення для забезпечення жорстких обмежень.
Мені б хотілося, щоб ядро сказало: "Ви належите до користувача foo (а не root), ви використовуєте багато пам'яті, і у нас не вистачить пам'яті. Вибачте чувак ... помирайте зараз!"
Або: "Що, до біса, ти робиш? Вам потрібно x MB, і доступно лише y MB. Так, SWAP порожній, але ви не збираєтесь використовувати SWAP для вашої брудної роботи, чи не так? Ні, я сказала ні! Ні пам'яті для тебе! Якщо ти будеш наполягати, ти помреш! "
overcommit_memory
спеціальний файл використовує оперативну пам’ять + SWAP в якості корисної пам'яті. Я все ще збираюся поміняти
ulimits
- це погана ідея, як це показано майже скрізь, оскільки це обмеження за процес… Я ви знаєте :) Про cgroups
це, безумовно, краще, але не вистачає чогось більш загального: я говорю про свій ноутбук, але я також володіти сервером "обчислення", яким нам ділитися троє. Якщо я буду застосовувати такі обмеження за користувачем, я буду обмежений найгіршим сценарієм, чи не так?
/proc/sys/vm/overcommit_memory
впливає на поведінку ядра при низькій пам'яті.