Мне нужно получить данные об использовании памяти в % из vmstat, но я не совсем понимаю некоторые цифры, относящиеся к памяти, отображаемые в vmstat.
В частности, учитывая такой вывод
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 139728 45396 199128 1236360 1 2 4 622 3 1 51 4 43 2 0
Каков общий объем памяти системы? Это 'swpd' + 'free' + 'buff' + 'cache', что в сумме составляет 1620612?
Каков свободный объем памяти системы? 45396, как показано в столбце «свободно»?
Проблема в том, что они не складываются и даже близко не похожи на то, что сообщил 'top'. Вывод 'top', который я получил примерно в то же время, что и 'vmstat's выше, выглядит так:
[...]
Mem: 4059616k total, 3965504k used, 94112k free, 200020k buffers
[...]
Итак... Я предполагаю, что в «vmstat» должны быть скрытые числа/опции, о которых я не знал?
Для этой цели мне нужно использовать «vmstat», а не другие команды, как указано в требовании.
Поэтому в идеале я хочу получить от 'vmstat' процент использования памяти, например:
<used_memory>/<total_memory> * 100%.
Спасибо!
решение1
То, что вы ищете, — это вывод «free»:
$ free
total used free shared buffers cached
Mem: 775556 759456 16100 0 22132 592484
-/+ buffers/cache: 144840 630716
Swap: 500344 21972 478372
Вот экскурсия:
Это устройство с 768 МБ физической оперативной памяти и разделом подкачки объемом 500-344 КБ.
759456 КБ «используется» (второй столбец, верхняя строка). Из этой «используемой» памяти 23132 КБ — это буферы (5-й столбец, верхняя строка) и 592484 КБ (шестой столбец, верхняя строка) — кэш, оставляя 144840 КБ (2-й столбец, 2-я строка) физической памяти, которая используется активными процессами.
Если учесть, что память, используемая буферами и кэшем, может быть использована для процессов, то остается 630716 КБ (3-й столбец, 2-я строка) физической памяти свободной.
Раздел подкачки, как я уже сказал, имеет размер 500344 КБ (первый столбец, нижняя строка). 21972 КБ (второй столбец, нижняя строка) файла подкачки используются, а 478372 КБ (третий столбец, нижняя строка) остаются свободными.
Таким образом, ваше определение % свободной памяти зависит от того, учитываете ли вы буферы и кэш или нет, а также учитываете ли вы подкачку или нет.
Этого должно быть достаточно, чтобы вы могли рассчитать нужный вам процент.
Вот вывод top и free:
$ top -n1 | grep "used," ; free
Mem: 775556k total, 751472k used, 24084k free, 20776k buffers
Swap: 500344k total, 21972k used, 478372k free, 586648k cached
total used free shared buffers cached
Mem: 775556 751344 24212 0 20776 586648
-/+ buffers/cache: 143920 631636
Swap: 500344 21972 478372
Вы можете видеть, как top и free согласуются (хотя и с небольшой разницей — это многопользовательский компьютер, и использование памяти top и free программами здесь отражено).
Добавьте «-s» при вызове vmstate, и вы увидите практически тот же вывод, только в другой форме:
$ vmstat -s ; free
775556 total memory
759920 used memory
674680 active memory
18440 inactive memory
15636 free memory
21892 buffer memory
594372 swap cache
500344 total swap
21972 used swap
478372 free swap
... output truncated ...
total used free shared buffers cached
Mem: 775556 759920 15636 0 21892 594372
-/+ buffers/cache: 143656 631900
Swap: 500344 21972 478372
Вы можете видеть, что vmstat показывает все те же цифры, что и free.
решение2
У меня тот же вопрос, что и у вас, и я придумал формулу
vmstat -s | awk ' $0 ~ /total memory/ {total=$1 } $0 ~/free memory/ {free=$1} $0 ~/buffer memory/ {buffer=$1} $0 ~/cache/ {cache=$1} END{print (total-free-buffer-cache)/total*100}'
Я протестировал это на версии vmstat из procps-ng 3.3.10 и vmstat из procps-ng 3.3.9
решение3
Я бы рекомендовал вам прочитать эту книгу IBM Redbook «Руководство по настройке и производительности Linux» (http://www.redbooks.ibm.com/abstracts/redp4285.html?Открыть). Он содержит подробную информацию о данных, возвращаемых многочисленными командами, и должен вам помочь.
Обычно я использую команду «free» в Linux или «cat /proc/meminfo».
решение4
ВотPOSIXфункция оболочки, которая округляет желаемый процент до ближайшего целого числа (для целей скриптинга это может быть более полезно, так какPOSIXТесты сравнения арифметических операций оболочки работают только с целыми числами):
# Vmstat (derived) Used Ram Percent
vurp() { vmstat -s | { read a b ; read c d ; echo $((100*$c/$a)) ; } ; }
vurp
Вывод (на моей системе):
12
То же самое, но с free
:
furp() { free | { read z; read a b c d; echo $((100*$c/$b)) ; } }