Перезагрузка Linux из памяти

Используйте оболочку для обеспечения этого. Например, создайте сценарий с чем-то как следующее:

#!/bin/sh
# Check to see if this is already running from some other day
mkdir /tmp/lock || exit 1
while ! command-to-execute-until-succeed; do
    # Wait 30 seconds between successive runs of the command
    sleep 30
done
rmdir /tmp/lock

После этого укажите на крон на сценарий.

5
05.09.2013, 21:05
2 ответа

В некоторых разбитых на страницы спросом системах виртуальной памяти операционная система отказывается выделять анонимные страницы (т.е. страницы, содержащие данные без источника файловой системы, такие как данные во время выполнения, стопка программы и т.д.), если нет достаточная область подкачки для выгрузки страниц для освобождения физической памяти. Этот строгий учет имеет преимущество, что каждому процессу гарантируют доступ к такой же виртуальной памяти, которую они выделяют, но также средства, что объем доступной виртуальной памяти по существу ограничен размером области подкачки.

На практике программы имеют тенденцию выделять больше памяти, чем они используют. Например, виртуальная машина Java выделяет большую виртуальную память на запуске, но сразу не использует его. Память, считающая в ядре Linux, пытается компенсировать это путем отслеживания объема памяти, на самом деле используемого процессами, и превышает возможности объема виртуальной памяти. Другими словами, объем виртуальной памяти, выделенной ядром, может превысить объем физической памяти и области подкачки, объединенной в системе. В то время как это приводит к лучшему использованию физической памяти и области подкачки, оборотная сторона - то, что, когда сумма используемой памяти превышает объем физической памяти и доступной области подкачки, ядро должно так или иначе освободить ресурсы памяти для выполнения обязательства по выделению памяти.

Механизм ядра, который используется для исправления памяти для заполнения чрезмерных обязательств, называют out-of-memory-killer (OOM-уничтожитель). Обычно механизм начнет избавляться от процессов "жулика" памяти-hogging к свободному память для других процессов. Однако, если vm.panic_on_oom установка sysctl является ненулевой, ядро запаникует вместо этого, когда система исчерпает память.

Возможные значения для vm.panic_on_oom установка следующие:

  • 0 (значение по умолчанию), Когда ситуация из памяти возникнет, OOM-уничтожитель, уничтожит процесс жулика.

  • 1 Ядро обычно паникует, но если процесс, который достиг его предельного набора выделения памяти с mbind(MPOL_BIND) или cpuset, процесс уничтожается вместо этого.

  • 2 Ядро всегда паникует в ситуации из памяти.

Эвристика, используемая OOM-уничтожителем, может быть изменена через vm.oom_kill_allocating_task установка sysctl. Возможные значения следующие:

  • 0 (значение по умолчанию) OOM-уничтожитель просканирует через список задач и выберет задачу жулика задачи, использующую большую память для уничтожения.

  • 1 (ненулевой) OOM-уничтожитель уничтожит задачу, которая инициировала условие из памяти.

Память ядра бухгалтерский алгоритм может быть настроена с vm.overcommit_memory настройки sysctl. Возможные значения следующие:

  • 0 Эвристика (по умолчанию) принимает на себя непосильные обязательства со слабыми проверками.

  • 1 Всегда принимайте на себя непосильные обязательства, никакие проверки.

  • 2 Строгий учет, в этом режиме предел виртуального адресного пространства определяется значением vm.overcommit_ratio настройки согласно следующей формуле:

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))
    

Когда строгий учет памяти будет использоваться, ядро больше не будет выделять анонимные страницы, если это не имеет достаточно свободной физической памяти или области подкачки для хранения страниц. Это означает, что важно, чтобы система была настроена с достаточной областью подкачки.

sysctl настройки могут быть проверены или изменены во времени выполнения с sysctl команда. Для внесения изменений постоянными, настройки могут быть записаны в /etc/sysctl.conf. Вышеупомянутые настройки также доступны через /proc/sys/vm интерфейс. Соответствующие файлы:

  • /proc/sys/vm/panic_on_oom

  • /proc/sys/vm/oom_kill_allocating_task

  • /proc/sys/vm/overcommit_memory

  • /proc/sys/vm/overcommit_ratio

16
27.01.2020, 20:32
  • 1
    ! Но разъединение просто закрылось и запустилось, я ничего не нахожу о oom в /var/log/messages файл. Я нахожу, что размер буфера растет и растет, никогда не спускайтесь! –  jofox 23.08.2013, 05:16
  • 2
    @jofox Вы рассмотрели возможность дефектной памяти? Проблемы RAM может быть трудно диагностировать, но инструмент диагностики памяти, такой как Memtest86 может оказаться полезным. –  Thomas Nyman 23.08.2013, 07:37
  • 3
    я протестировал. Физическая память в порядке. –  jofox 23.08.2013, 08:14
  • Я думаю, что необходимо узнать, что процесс использовал партию памяти. Возможно, программа имеет ошибку утечки памяти. Необходимо зафиксировать его.
  • Если не будет никакой достаточной памяти, то Linux завершит работу, некоторый процесс использовал партию памяти или саму перезагрузку. Поскольку ядро должно использовать некоторую память.
  • Другое поведение определяется конфигурацией. Но я думаю, что необходимо исправить ошибку утечки памяти.
1
27.01.2020, 20:32
  • 1
    "Другое поведение определяется конфигурацией", какую конфигурацию Вы имеете в виду? –  jofox 22.08.2013, 08:20
  • 2
    я не помню. –  Edward Shen 22.08.2013, 09:06
  • 3
    я уверен, что нет ошибки утечки памяти. Почему Linux перезагружает себя, но не исправляет память, когда нет никакой enouth памяти? –  jofox 22.08.2013, 09:08

Теги

Похожие вопросы