Стандартные файлы / инструменты, которые сообщают о памяти, имеют разные форматы в разных дистрибутивах Linux. Например, на Arch и Ubuntu.
арочный
$ free total used free shared buff/cache available Mem: 8169312 3870392 2648348 97884 1650572 4110336 Swap: 16777212 389588 16387624 $ head /proc/meminfo MemTotal: 8169312 kB MemFree: 2625668 kB MemAvailable: 4088520 kB Buffers: 239688 kB Cached: 1224520 kB SwapCached: 17452 kB Active: 4074548 kB Inactive: 1035716 kB Active(anon): 3247948 kB Inactive(anon): 497684 kB
Ubuntu
$ free total used free shared buffers cached Mem: 80642828 69076080 11566748 3063796 150688 58358264 -/+ buffers/cache: 10567128 70075700 Swap: 20971516 5828472 15143044 $ head /proc/meminfo MemTotal: 80642828 kB MemFree: 11565936 kB Buffers: 150688 kB Cached: 58358264 kB SwapCached: 2173912 kB Active: 27305364 kB Inactive: 40004480 kB Active(anon): 7584320 kB Inactive(anon): 4280400 kB Active(file): 19721044 kB
Итак, как я могу переносить (только через дистрибутивы Linux) и надежно получать объем памяти, исключая подкачку, который доступен для моего программного обеспечения для использования в конкретное время? Предположительно, это то, что показано как «available» и «MemAvailable» в выходных данных free
и cat /proc/meminfo
в Arch, но как мне получить то же самое в Ubuntu или другом дистрибутиве?
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') '{a[$1]=$2}END{m=a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]; print a["MemAvailable:"],m-low}' /proc/meminfo
которое должно дать мне одинаковое число, напечатанное дважды. Однако второе число (мое понимание алгоритма, который вы предлагаете) выше, чемMemAvailable
показано на рис/proc/meminfo
. Что я делаю неправильно?/proc/zoneinfo
считает страницы размером в 4 КБamd64
; Вам также не хватает дополнительной безопасности, добавленной в кэш страниц и в память для восстановления. Упрощая последнее, мы можем вычесть нижний водяной знак три раза, поэтомуm-12*low
(3 × 4 КБ) дает правильный результат в моей системе. (Это упрощение недооценивает доступную память, если кэш страниц или память для восстановления меньше, чем в два раза меньше нижнего водяного знака, но вы все равно не захотите использовать много памяти в этой ситуации, так что это кажется разумным компромиссом.)(file)
записей, ни записейSReclaimable
? На старом ящике centos с ядром v 2.6.18-348.16.1.el5xen (peruname -r
) я получаю следующий вывод: pastebin.com/iFWiM1kX . Ваш расчет только тянетMemFree
частьХотя ответа Стивена вполне достаточно и он ошибается из-за осторожности, я решил написать полную логику, включая минимальные сравнения. Информация сначала читается из / proc / meminfo и сохраняется в переменной, так что детали памяти согласованы.
Результат хранится в переменной в байтах.
источник