В Linux, как мне рассчитать объем свободной памяти из информации в / proc / mem? - PullRequest
5 голосов
/ 22 сентября 2009

В / proc / mem есть много полей: я знаю, что не могу просто взять "MemFree", потому что большая часть памяти фактически кешируется. Вопрос в том, как рассчитать объем свободной памяти?

Предположения:

  • Система настроена без пространства подкачки.
  • Мое определение «свободной памяти» таково, что malloc начинает давать сбой, когда он достигает нуля.

Ответы [ 6 ]

7 голосов
/ 08 ноября 2012

Если, как вы говорите, система настроена без пространства подкачки, то объем свободной памяти можно рассчитать, добавив значения "MemFree", "Buffers" и "Cached" из /proc/meminfo.

.

Это именно то, что показывает команда 'free -m' в разделе 'free' в строке '- / + buffers / cache'.

В Python я бы реализовал это следующим образом:

 with open('/proc/meminfo', 'rt') as f:
        vals = {}
        for i in f.read().splitlines():
            try:
                name, val = i.split(':')
                vals[name.strip()] = int(val.split()[0])
            except:
                pass

 memfree = vals['MemFree'] + vals['Buffers'] + vals['Cached']

Это даст значение в килобайтах.

Как уже говорили другие, malloc вряд ли когда-либо вернет ноль. Linux будет перераспределяться, и когда вы начнете использовать страницу, которая действительно не может быть найдена, включится убийца OOM.

5 голосов
/ 22 сентября 2009

У меня такое чувство, что вы идете по неверному пути. Что вы хотите сделать с этой информацией? Хотите посмотреть, сможете ли вы выделить достаточно памяти для следующей операции? Если это так, вы можете позвонить malloc и проверить его возвращаемое значение. Если он возвращает null, память не была доступна.

Обратите внимание, что память является высокодинамичным ресурсом. Даже ваш акт открытия / закрытия файловой системы /proc может привести к перегрузке памяти. Даже если вам каким-то образом удастся получить сумму, которую вы могли бы выделить с помощью malloc(), никто не может гарантировать, что такой же объем памяти будет доступен, если вы попытаетесь выделить доли секунды .

4 голосов
/ 22 сентября 2009

Используйте источник Люк!

free.c - исходный код утилиты 'free' для командной строки
sysinfo.c - см. Метод meminfo () для примера того, как читается / proc / meminfo.

Хотя чтение / proc довольно простое, предсказать, не завершится ли malloc, не так просто. В то время как другие упоминали такие проблемы, как чрезмерная запутанность, проблема. Стандартный подход состоит в том, чтобы просто попытаться выделить то, что вам нужно, и, если вы не можете, чтобы это сработало изящно или работать с меньшими затратами.

Эту серию статей стоит прочитать, если у вас есть достаточно времени: Что должен знать каждый программист о памяти.

2 голосов
/ 22 сентября 2009

AFAIK, malloc по умолчанию перезапускается в linux, поэтому malloc не потерпит неудачу, когда вы можете этого ожидать. Вы не увидите, что что-то пойдет не так, пока не коснетесь памяти, которую вы использовали, и убийца ООМ может быть разбужен.

Это может представлять интерес (не знаю, насколько это точно.)

http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html

, но поиск в Linux для Malcom overcommit, вероятно, вызовет некоторые интересные вещи.

1 голос
/ 29 июня 2012

Следующая программа вычисляет использование памяти в среде Linux.

{
FILE *fp;
char tmpline[1024];
char key[1024];
int line = 0;
int num1 = 0;
int num2 =0;
int val = 0;
int cat = 0;
fp = fopen("/proc/meminfo","r");

fgets(tmpline,256,fp);
sscanf(tmpline,"%*s %d\n",&num1);

fgets(tmpline,256,fp);
sscanf(tmpline,"%*s %d\n",&num2);

printf("toatl mem = %d\n free mem = %d\n",num1,num2);

  val = num1-num2;
printf("Used Mem =%d\n",val );

cat = val*100/num1;
printf("per = %d%\n",cat);

fclose(fp);
return(0);
}
1 голос
/ 22 сентября 2009

Попробуйте взглянуть на ответы на этот предыдущий вопрос.

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