Це може.
У Linux є два різні умови пам'яті. Що ви стикаєтесь, залежить від значення sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
Вступ:
Ядро може виконувати те, що називається «перевиконання пам'яті». Це коли ядро виділяє програмам більше пам’яті, ніж є насправді в системі. Це робиться в надії, що програми насправді не використовуватимуть усю виділену їм пам’ять, оскільки це досить поширене явище.
overcommit_memory = 2
Коли overcommit_memory
встановлено значення 2
, ядро взагалі не виконує жодних перевиконань. Замість того, коли програмі виділяється пам'ять, гарантується доступ до цієї пам'яті. Якщо в системі недостатньо вільної пам'яті, щоб задовольнити запит на розподіл, ядро просто поверне помилку для запиту. Саме програма повинна витончено впоратись із ситуацією. Якщо він не перевірить, що розподіл вдалося, коли воно справді не вдалося, програма часто зустріне segfault.
У випадку сегмента за замовчуванням ви повинні знайти такий рядок у висновку dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
Це at 0
означає, що програма намагалася отримати доступ до неініціалізованого вказівника, що може бути результатом невдалого виклику розподілу пам'яті (але це не єдиний спосіб).
overcommit_memory = 0 і 1
Коли overcommit_memory
встановлено 0
або 1
, ввімкнено перевиконання, а програмам дозволяється виділяти більше пам’яті, ніж дійсно доступно.
Однак, коли програма хоче використовувати пам'ять, яка їй була виділена, але ядро виявляє, що насправді у неї недостатньо пам'яті, щоб задовольнити її, їй потрібно повернути деяку кількість пам'яті. Спочатку він намагається виконувати різні завдання з очищення пам'яті, такі як промивання кеш-пам'яті, але якщо цього недостатньо, то процес припиняється. Це припинення виконується OOM-Killer. OOM-Killer розглядає систему, щоб побачити, які програми використовують яку пам’ять, як довго вони працюють, хто їх запускає та ряд інших факторів, щоб визначити, хто з них загине.
Після того, як процес був убитий, пам'ять, яку він використовував, звільняється, і програма, яка щойно спричинила стан поза пам'яті, тепер має необхідну йому пам'ять.
Однак навіть у цьому режимі програмам все одно може бути відмовлено у запитах на розподіл. Коли overcommit_memory
це так 0
, ядро намагається найкраще здогадатися, коли воно повинно починати відхиляти запити на розподіл. Коли він встановлений 1
, я не впевнений, яке визначення він використовує, щоб визначити, коли йому слід відмовити у запиті, але він може заперечувати дуже великі запити.
Ви можете бачити, чи є учасник вбивці OOM, дивлячись на вихідні дані dmesg
та знаходячи такі повідомлення, як:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB