コマンド ラインで pid を入力し、予約されていない最大の連続アドレス空間を取得したいと考えています。何か案は?
64 ビット RHEL 5.4 で実行されている 32 ビット アプリは、しばらく (たとえば 24 時間) 実行した後、異常終了します。その時のメモリ使用量は最大で 2.5 GB ですが、メモリ エラーが発生します。アプリのメモリ空間が断片化されているため、大きなファイルの mmap に失敗していると考えられます。私は本番サーバーに行って、その理論をテストしたかったのです。
コマンド ラインで pid を入力し、予約されていない最大の連続アドレス空間を取得したいと考えています。何か案は?
64 ビット RHEL 5.4 で実行されている 32 ビット アプリは、しばらく (たとえば 24 時間) 実行した後、異常終了します。その時のメモリ使用量は最大で 2.5 GB ですが、メモリ エラーが発生します。アプリのメモリ空間が断片化されているため、大きなファイルの mmap に失敗していると考えられます。私は本番サーバーに行って、その理論をテストしたかったのです。
上記のコメントの少し良いバージョン:
#!perl -T
use warnings;
use strict;
scalar(@ARGV) > 0 or die "Use: $0 <pid>";
my $pid = $ARGV[0];
$pid = oct($pid) if $pid=~/^0/; # support hex and octal PIDs
$pid += 0; $pid = abs(int($pid)); # make sure we have a number
open(my $maps, "<", "/proc/".$pid."/maps") or
die "can't open maps file for pid ".$pid;
my $max = 0;
my $end = 0;
while (<$maps>) {
/([0-9a-f]+)-([0-9a-f]+)/;
$max = hex ($1) - $end if $max < hex ($1) - $end;
$end = hex ($2);
}
close ($maps);
END {
print "$max\n";
}
おそらくあなたが望むものではありませんが、プロセス内から、mmap
割り当てなしで ing によってバイナリ検索を行うことができます。つまりmmap(4GB)
、失敗しmmap(2GB)
た場合、成功した場合mmap(3GB
) などです。
メモリエラーが発生します。アプリのメモリ空間が断片化されているため、大きなファイルの mmap に失敗していると考えられます。
ただし、たとえば RAM + スワップが十分に不足している場合など、紙の上にまだ多くの空き仮想アドレス範囲がある場合でも、OOM エラーが発生する可能性があります。さらに、システムやプログラムでオーバーコミットがオフになっている (sysctl -a) か、スワッピングが禁止されている (mlock(2)) か、実際にはマッピングに非常に鈍い制限がある (ulimit -v) — 後者の場合があります。何らかの方法でそのような ulimits を設定する一部のディストリビューションで実行するのは簡単です。