RTFM.WIKI

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

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

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


linux:oom

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

Теория

Практика

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

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

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

Показать

Скрыть

panic_on_oom

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) {
            break;
        }
 
        memset(b, 1, MB);
        printf("Allocating %d MB\n", (++c * 10));
    }
 
    exit(0);
}

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

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

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

Запись в 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

EOM

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/oom.txt · Последнее изменение: 2018/03/16 01:42 — 127.0.0.1