Отрегулируйте oom_score при запуске процесса

У меня есть несколько серверов, которые начали "убивать" oom свои процессы резервного копирования, и, хотя я понимаю, что возникновение условия oom само по себе довольно плохо, мне нужно, чтобы этот процесс не умер, чтобы резервные копии происходили правильно, пока проблема с памятью решена,

С этой целью я попытался создать способ запуска процессов с настроенными oom_scores способом, аналогичным запуску процесса с nice,

#!/bin/bash

function oom_adj_exec() {
    while getopts ':n:' opt; do
        case $opt in
            n)
                if grep -q '^-\?[0-9]\+$' <(echo "$OPTARG"); then
                    if [ "$OPTARG" -ge -1000 -a "$OPTARG" -le 1000 ]; then
                        oom_score_adjust=$OPTARG
                    else
                        echo "Acceptable values for -n are from -1000 to 1000" >&2
                        return 255
                    fi
                else
                    echo "Improper format for -n: $OPTARG" >&2
                    return 255
                fi
                break
                ;;
            :)
                echo "option -$OPTARG requires a value" >&2
                return 255
                ;;
            *)
                echo "Unknown option -$opt" >&2
                return 255
                ;;
        esac
    done

    command=${@:$OPTIND}

    # job control requires the monitor option which
    # is usually not set for non-interactive shells
    prev_state=$(set +o | grep monitor)
    set -o monitor

    $command &
    pid=$!

    echo "$oom_score_adjust" > /proc/$pid/oom_score_adj

    fg %% > /dev/null

    ecode=$?

    # restore the previous state of the shell
    $prev_state

    return $ecode
}

oom_adj_exec $@

Пример использования:

./oom_adj_exec.sh -n -500 /usr/bin/mem_bloater

Хотя это, кажется, работает, я не могу избавиться от ощущения, что там что-то ждет, чтобы пойти ужасно неправильно. Есть ли что-то, что выделяется как действительно ужасная идея и / или катастрофа, ожидающая случиться?

1 ответ

Я также сделал это, но не так хорошо, например:

(echo 1000 > /proc/self/oom_score_adj && exec /usr/bin/blah)

Поскольку он заключен в скобки, он запускает подоболочку, устанавливает оценку OOM для оболочки (в данном случае 1000, чтобы сделать ее крайне вероятной гибелью в ситуации OOM), а затем exec заменяет подоболочку намеченной программой, оставляя новую оценку OOM без изменений. Это также не повлияет на оценку OOM родительского процесса / оболочки, так как все происходит внутри подоболочки.

Другие вопросы по тегам