gpt4 book ai didi

linux - 在 Linux 上防止内存不足 (OOM) 卡住的最佳方法是什么?

转载 作者:IT王子 更新时间:2023-10-28 23:29:02 27 4
gpt4 key购买 nike

有没有办法让 OOM killer 工作并防止 Linux 卡住?我一直在运行 Java 和 C# 应用程序,通常会使用分配的任何内存,并且(如果我理解正确的话)过度使用会导致机器死机。现在,作为临时解决方案,我补充说,

vm.overcommit_memory = 2
vm.overcommit_ratio = 10

到/etc/sysctl.conf。

感谢任何能够解释为什么现有的 OOM killer 不能以有保证的方式正确运行的人,只要内核用完“真实”内存就会终止进程。

编辑——许多回答都与 Michael 的“如果您遇到与 OOM killer 相关的问题,那么您可能需要修复导致您内存不足的任何问题”类似。我认为这不是正确的解决方案。总会有有错误的应用程序,我想调整内核,这样我的整个系统就不会死机。以我目前的技术理解,这似乎不是不可能的。

最佳答案

下面是我编写的一个非常基本的 perl 脚本。稍作调整可能会很有用。您只需将我拥有的路径更改为使用 Java 或 C# 的任何进程的路径。您也可以更改我用来重新启动命令的 kill 命令。当然,为了避免手动输入 perl memusage.pl,您可以将其放入您的 crontab 文件中以自动运行。您还可以使用 perl memusage.pl > log.txt 将其输出保存到日志文件中。对不起,如果它没有真正帮助,但我喝杯咖啡时很无聊。 :-D 干杯

#!/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();

关于linux - 在 Linux 上防止内存不足 (OOM) 卡住的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2125812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com