Linux: как проверить самый большой непрерывный диапазон адресов, доступный процессу - PullRequest
2 голосов
/ 23 февраля 2012

Я хочу ввести pid в командной строке и вернуть самое большое непрерывное адресное пространство, которое не было зарезервировано. Есть идеи?

Наше 32-битное приложение, работающее на 64-битной RHEL 5.4, вылетает после некоторого времени работы, скажем, 24 часа. В это время используется только до 2,5 ГБ памяти, но мы получаем ошибки памяти. Мы считаем, что не удается отобразить большие файлы, потому что пространство памяти приложения фрагментировано. Я хотел выйти на рабочие серверы и просто проверить эту теорию.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Возможно, это не совсем то, что вам нужно, но внутри процесса можно выполнить бинарный поиск путем mmap без выделения. То есть mmap(4GB), если это не удастся mmap(2GB), если это удастся mmap(3GB), и так далее.

2 голосов
/ 23 февраля 2012

Чуть более приятная версия моего комментария:

#!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";
}
0 голосов
/ 23 февраля 2012

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

Однако можно также получить ошибки OOM, сохраняя при этом множество свободных диапазонов виртуальных адресов на бумаге, например, из-за недостаточного количества оперативной памяти + подкачки. Кроме того, в вашей системе и / или программе (ах) может быть отключено переопределение (sysctl -a), или запрещен обмен (mlock (2)), или у вас на самом деле очень резкое ограничение на сопоставления (ulimit -v) - последнее легко запустить в некоторых дистрибутивах, которые устанавливают такие ограничения так или иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...