Как вы находите физическую память свободной на машине в Ruby? - PullRequest
7 голосов
/ 27 октября 2010

Я хотел бы знать, сколько физической памяти доступно в системе, исключая любые операции подкачки.Есть ли способ получить эту информацию в Ruby?

Ответы [ 6 ]

10 голосов
/ 27 октября 2010

Если вы используете Linux, вы обычно используете «свободную» команду для поиска физической памяти, то есть детали ОЗУ в системе

 output = %x(free)

вывод будет выглядеть примерно так, как следующая строка

" total used free shared buffers cached\nMem: 251308 201500 49808 0 3456 48508\n-/+ buffers/cache: 149536 101772\nSwap: 524284 88612 435672\n"

Вы можете извлечь необходимую информацию, используя простые манипуляции со строками, такие как

output.split(" ")[7] даст полную память output.split(" ")[8] даст использованную память output.split(" ")[9] даст свободную память

4 голосов
/ 23 марта 2012

Слегка версия ответа AndrewKS:

total_memory_usage_in_k = `ps -Ao rss=`.split.map(&:to_i).inject(&:+)
3 голосов
/ 06 февраля 2013

Вы можете использовать этот самоцвет для получения различной системной информации http://threez.github.com/ruby-vmstat/

3 голосов
/ 27 октября 2010

Что ж, команда Unix "top", похоже, не работает в Ruby, поэтому попробуйте это:

# In Kilobytes
memory_usages = `ps -A -o rss=`.split("\n")
total_mem_usage = memory_usages.inject { |a, e| a.to_i + e.strip.to_i }

Это "кажется" правильным.Я не гарантирую это.Кроме того, это занимает намного больше времени, чем система, поэтому к моменту завершения физическая память изменилась бы.

1 голос
/ 05 марта 2016

Это отвечает как для Ruby и Bash, так и, вероятно, также для Python и остальных:

#!/usr/bin/env bash 
# This file is in public domain. 
# Initial author: martin.vahi@softf1.com

#export S_MEMINFO_FIELD="Inactive"; \
export S_MEMINFO_FIELD="MemTotal"; \
ruby -e "s=%x(cat /proc/meminfo | grep $S_MEMINFO_FIELD: | \
gawk '{gsub(/MemTotal:/,\"\");print}' | \
gawk '{gsub(/kB/,\"*1024\");print}' | \
gawk '{gsub(/KB/,\"*1024\");print}' | \
gawk '{gsub(/KiB/,\"*1024\");print}' | \
gawk '{gsub(/MB/,\"*1048576\");print}' | \
gawk '{gsub(/MiB/,\"*1048576\");print}' | \
gawk '{gsub(/GB/,\"*1073741824\");print}' | \
gawk '{gsub(/GiB/,\"*1073741824\");print}' | \
gawk '{gsub(/TB/,\"*1099511627776\");print}' | \
gawk '{gsub(/TiB/,\"*1099511627776\");print}' | \
gawk '{gsub(/B/,\"*1\");print}' | \
gawk '{gsub(/[^1234567890*]/,\"\");print}' \
); \
s_prod=s.gsub(/[\\s\\n\\r]/,\"\")+\"*1\";\
ar=s_prod.scan(/[\\d]+/);\
i_prod=1;\
ar.each{|s_x| i_prod=i_prod*s_x.to_i};\
print(i_prod.to_s+\" B\")"

Здесь следует отметить, что "\" на концах строк является продолжением строки Bash,По сути, все это должен быть однострочный, за исключением строк с комментариями, которые необходимо удалить.Двоеточие в конце

grep $S_MEMINFO_FIELD:

важно, потому что

cat /proc/meminfo | grep Inactive

печатает несколько строк, но остальная часть сценария работает с предположением, что grep выводит только однулиния.Согласно

https://unix.stackexchange.com/questions/263881/convert-meminfo-kb-to-bytes

/ proc / meminfo использует 1024 независимо от того, является ли единица измерения "кБ" или "КБ".У меня не было никакой информации о частях GiB, GB и TB, но я предполагаю, что они следуют одному и тому же стилю и 1MB = 1024 * 1024KiB.

Я создал специальный скрипт Bash для Linux, который принимает / proc / meminfoимя поля в качестве аргумента 1. командной строки и выводит значение в байтах:

http://longterm.softf1.com/2016/comments/stackoverflow_com/2016_03_07_mmmv_proc_meminfo_filter_t1.bash

(архивная копия: https://archive.is/vjcNf)

СпасибоВы за чтение моего комментария.Я надеюсь, что это помогает.: -)

0 голосов
/ 03 июля 2019

Вы можете использовать всего драгоценный камень (я автор):

require 'total'
puts Total::Mem.new.bytes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...