Попробуйте parseInt.
var number = parseInt("10", 10); //number will have value of 10.
Если oom_adj вашего процесса установлен в -17, он не будет рассматриваться как убийство, хотя я сомневаюсь, что это проблема здесь.
cat /proc/<pid>/oom_adj
сообщит вам значение oom_adj вашего процесса (ов).
Я бы сказал, что лучший способ предотвратить зависание OOM - не исчерпать виртуальную память. Если вы регулярно исчерпываете виртуальную память или приближаетесь, то у вас большие проблемы.
Большинство задач не очень хорошо справляются с ошибочными распределениями памяти, поэтому имеют тенденцию к краху или потере данных. Исчерпание виртуальной памяти (с перегрузкой или без нее) приведет к сбою некоторых выделений. Обычно это плохо.
Кроме того, до того, как в вашей операционной системе закончится виртуальная память, она начнет делать плохие вещи, такие как удаление страниц из часто используемых общих библиотек, что может привести к снижению производительности, так как их приходится часто возвращать назад, что очень плохо для пропускной способности.
Мои предложения:
И, возможно, также
Если это полезно в вашем случае использования.
Большинство многопроцессорных серверов работают с настраиваемым (максимальным) числом процессов, поэтому обычно его можно уменьшить. Многопоточные серверы обычно позволяют вам сконфигурировать, сколько памяти использовать для своих буферов и т.д. внутри.
Прежде всего, как вы можете быть уверены, что замораживания связаны с убийцей ООМ? У меня есть сеть систем на местах, и я получаю нередкие зависания, которые, по-видимому, не связаны с OOM (наше приложение довольно стабильно использует память). Может ли это быть что-то еще? Есть ли интересное оборудование? Есть нестабильные драйверы? Высокопроизводительное видео?
Даже если бы убийца OOM был вовлечен и работал, у вас все равно были бы проблемы, потому что то, что, как вы думали, работало, теперь уже мертво, и кто знает, какой беспорядок он оставил.
Действительно, если вы испытываете проблемы, связанные с OOM killer, то вам, вероятно, нужно исправить то, что приводит к нехватке памяти.
Я обнаружил, что решение проблем со стабильностью в основном зависит от точного определения основной причины. К сожалению, для этого требуется способность видеть, что происходит, когда возникает проблема, а это действительно плохое время для попытки запуска различных программ мониторинга.
Одна вещь, которую я иногда находил полезным, состояла в том, чтобы запустить небольшой скрипт мониторинга во время загрузки, который бы регистрировал различные интересные цифры и снимал запущенные процессы. Затем, в случае аварии, я мог посмотреть на ситуацию непосредственно перед аварией. Иногда я обнаруживал, что интуиция была совершенно неверной в отношении первопричины. К сожалению, этот скрипт давно устарел, или я бы дал ссылку.
Ниже приведен действительно базовый скрипт на 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();