Что лучший способ состоит в том, чтобы предотвратить замораживания из памяти (OOM) на Linux?

Попробуйте parseInt.

var number = parseInt("10", 10); //number will have value of 10.
28
задан gatoatigrado 25 January 2010 в 09:23
поделиться

5 ответов

Если oom_adj вашего процесса установлен в -17, он не будет рассматриваться как убийство, хотя я сомневаюсь, что это проблема здесь.

cat /proc/<pid>/oom_adj

сообщит вам значение oom_adj вашего процесса (ов).

1
ответ дан SyntaxT3rr0r 20 November 2019 в 04:09
поделиться

Я бы сказал, что лучший способ предотвратить зависание OOM - не исчерпать виртуальную память. Если вы регулярно исчерпываете виртуальную память или приближаетесь, то у вас большие проблемы.

Большинство задач не очень хорошо справляются с ошибочными распределениями памяти, поэтому имеют тенденцию к краху или потере данных. Исчерпание виртуальной памяти (с перегрузкой или без нее) приведет к сбою некоторых выделений. Обычно это плохо.

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

Мои предложения:

  • Получите больше оперативной памяти
  • Запустите меньше процессов
  • Заставьте процессы, которые вы выполняете, использовать меньше памяти (Это может включать исправление утечек памяти в их)

И, возможно, также

  • Установите больше пространства подкачки

Если это полезно в вашем случае использования.

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

-1
ответ дан MarkR 20 November 2019 в 04:09
поделиться

Прежде всего, как вы можете быть уверены, что замораживания связаны с убийцей ООМ? У меня есть сеть систем на местах, и я получаю нередкие зависания, которые, по-видимому, не связаны с OOM (наше приложение довольно стабильно использует память). Может ли это быть что-то еще? Есть ли интересное оборудование? Есть нестабильные драйверы? Высокопроизводительное видео?

Даже если бы убийца OOM был вовлечен и работал, у вас все равно были бы проблемы, потому что то, что, как вы думали, работало, теперь уже мертво, и кто знает, какой беспорядок он оставил.

Действительно, если вы испытываете проблемы, связанные с OOM killer, то вам, вероятно, нужно исправить то, что приводит к нехватке памяти.

-1
ответ дан Michael Kohne 20 November 2019 в 04:09
поделиться

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

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

-1
ответ дан Thomas Erskine 20 November 2019 в 04:09
поделиться

Ниже приведен действительно базовый скрипт на perl, который я написал. С небольшой доработкой он может быть полезен. Вам просто нужно изменить пути, которые у меня есть к путям любых процессов, использующих Java или C#. Вы можете изменить команды kill, которые я использовал для перезапуска команд. Конечно, чтобы избежать ручного ввода perl memusage.pl, вы можете поместить его в ваш кронтаб-файл для автоматического запуска. Вы также можете использовать perl memusage.pl > log.txt, чтобы сохранить его вывод в файл журнала. Извините, если это не помогает, но мне было скучно, когда я пил чашку кофе. :-D Cheers

#!/usr/bin/perl -w
# Checks available memory usage and calculates size in MB
# If free memory is below your minimum level specified, then
# the script will attempt to close the troublesome processes down
# that you specify. If it can't, it will issue a -9 KILL signal.
#
# Uses external commands (cat and pidof)
#
# Cheers, insertable

our $memmin = 50;
our @procs = qw(/usr/bin/firefox /usr/local/sbin/apache2);

sub killProcs
{
    use vars qw(@procs);
    my @pids = ();
    foreach $proc (@procs)
    {
        my $filename=substr($proc, rindex($proc,"/")+1,length($proc)-rindex($proc,"/")-1);
        my $pid = `pidof $filename`;
        chop($pid);
        my @pid = split(/ /,$pid);
        push @pids, $pid[0];
    }
    foreach $pid (@pids)
    {
        #try to kill process normall first
        system("kill -15 " . $pid); 
        print "Killing " . $pid . "\n";
        sleep 1;
        if (-e "/proc/$pid")
        {
            print $pid . " is still alive! Issuing a -9 KILL...\n";
            system("kill -9 " + $pid);
            print "Done.\n";
        } else {
            print "Looks like " . $pid . " is dead\n";
        }
    }
    print "Successfully finished destroying memory-hogging processes!\n";
    exit(0);
}

sub checkMem
{
    use vars qw($memmin);
    my ($free) = $_[0];
    if ($free > $memmin)
    {
        print "Memory usage is OK\n";
        exit(0);
    } else {
        killProcs();
    }
}

sub main
{
    my $meminfo = `cat /proc/meminfo`;
    chop($meminfo);
    my @meminfo = split(/\n/,$meminfo);
    foreach my $line (@meminfo)
    {
        if ($line =~ /^MemFree:\s+(.+)\skB$/)
        {
            my $free = ($1 / 1024);
            &checkMem($free);
        }
    }
}

main();
3
ответ дан 28 November 2019 в 03:58
поделиться
Другие вопросы по тегам:

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