Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта

Боковая панель




Добавить новую страницу

You are not allowed to add pages

Что такое OOM и oom-killer Out of memomy, killer, oom-killer



Перезагрузка при OOM

Мы можем настроить систему таким образом, чтобы при OOM у нас был kernel panic и система автоматически перезагружалась.

Скопирую часть из документации с сайта kernel.org

Click to display ⇲

Click to hide ⇱


This enables or disables panic on out-of-memory feature.

If this is set to 0, the kernel will kill some rogue process, called oom_killer. Usually, oom_killer can kill rogue processes and system will survive.

If this is set to 1, the kernel panics when out-of-memory happens. However, if a process limits using nodes by mempolicy/cpusets, and those nodes become memory exhaustion status, one process may be killed by oom-killer. No panic occurs in this case. Because other nodes' memory may be free. This means system total status may be not fatal yet.

If this is set to 2, the kernel panics compulsorily even on the above-mentioned. Even oom happens under memory cgroup, the whole system panics.

The default value is 0. 1 and 2 are for failover of clustering. Please select either according to your policy of failover. panic_on_oom=2+kdump gives you very strong tool to investigate why oom happens. You can get snapshot.

Устанавливаем параметры для ядра через sysctl

# sysctl vm.panic_on_oom = 1
# sysctl kernel.panic = 30 # время ожидания в секундах до перезагрузки

Или чтобы настройки остались после перезагрузки вносим их в файл sysctl

echo "vm.panic_on_oom = 1" >> /etc/sysctl.conf
echo "kernel.panic = 30" >> /etc/sysctl.conf

Тест panic_on_oom

Теперь осталось вызвать Пиковую даму OOM.

В этом вопросе меня выручил блог.

Надо собрать простую программу на С

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MB 10485760
int main(int argc, char *argv[]) {
    void *b = NULL;
    int c = 0;
    while(1) {
        b = (void *) malloc(MB);
        if (!b) {
        memset(b, 1, MB);
        printf("Allocating %d MB\n", (++c * 10));

Компилятор, сборка, запуск

# yum install gcc 
# gcc -O2 oom.c -o oom
# ./oom
Allocating 10 MB
Allocating 20 MB
Allocating 7500 MB
Allocating 7510 MB

Система ушла в ребут.

Запись в syslog

Mar 12 16:51:25 shisp1 kernel: in:imjournal invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Mar 12 16:51:25 shisp1 kernel: [<ffffffff81186394>] oom_kill_process+0x254/0x3d0
Mar 12 16:51:25 shisp1 kernel: [<ffffffff81185e3d>] ? oom_unkillable_task+0xcd/0x120
Mar 12 16:51:25 shisp1 kernel: Out of memory: Kill process 7112 (oom) score 904 or sacrifice child
Mar 12 16:51:25 shisp1 kernel: Killed process 7112 (oom) total-vm:7707656kB, anon-rss:7694760kB, file-rss:20kB, shmem-rss:0kB


This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies


Enter your comment. Wiki syntax is allowed:
linux/oom.txt · Последнее изменение: 2018/03/16 01:42 (внешнее изменение)