2012-02-22 1 views
2

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

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

+1

'cat/proc//maps' плюс некоторые awk/perl/любые массажи? – ninjalj

+1
+0

Спасибо! Отлично! Мне пришлось изменить двойной '' на один', чтобы заставить его работать. – johnnycrash

ответ

2

Slighly лучше вариант моего выше комментарий:

#!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

Действительно ли работает '#! Perl'? У меня создалось впечатление, что всегда должен был быть абсолютный путь. – zwol

+0

@ Zack: не очень. Я положил его туда, чтобы заставить «-T» (это просто показывает, что я сделал слишком много кода-гольфа). – ninjalj

+0

Незнакомый nitpick - вы забыли проверить пространство после окончания последнего сопоставления (которое заканчивается на максимально допустимом адресе пользовательского пространства, что зависит от конфигурации ядра). – caf

2

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

0

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

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

+0

У нас более 70 ГБ на каждом сервере. Мы запускаем 24 копии приложения. Он достигает примерно 2,5 г, а затем исчезает без основного файла. Я собираюсь сделать запись в журнале, возможно, она уже есть, когда ей не удается malloc или mmap. Каждый сервер использует около 1 г общей памяти MMAP. ulimit -v unlimited overcommit_memory = 0 – johnnycrash

Смежные вопросы