Obtenga el uso actual de la memoria de proceso de ruby
memory process (5)
Cuando intenté resolver este problema hace un año, realicé una gran cantidad de búsquedas en línea y excavación de API, y solo pude resolverlo mediante una llamada al sistema de ps.
En OS X 10.7.2 y Red Hat 4.1.2-13 (en EC2):
pid, size = `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)
Esto capta y coloca el tamaño de memoria residente del proceso en kilobytes en la variable de tamaño.
Con un poco de esfuerzo, esto podría limpiarse, pero la mayor parte del tiempo es pasar llamadas a ps y capturar su producción, así que no creo que valga la pena el tiempo.
Me gustaría formatear mi salida Logger
para incluir el uso actual de la memoria, como parte de un proceso de larga ejecución.
¿Hay algo incorporado en Ruby para esto, un poco como memory_get_usage()
PHP? ¿O debo ejecutar algunos comandos de shell para obtenerlo de ps
?
El uso de comandos externos en Ruby como ps
mediante el uso de patillas respaldará el proceso actual mientras dure el comando. Esto significa que si su proceso Ruby consume 300 mb, necesitará otros 300 mb solo para ejecutar cualquiera de estas soluciones `ps -o rss #{$$}`.strip.split.last.to_i
.
En sistemas basados en Linux, puede obtener información de memoria de proceso leyendo /proc/PID/statm
. El segundo campo es el Tamaño del conjunto residente en número de páginas del kernel. Convertir las páginas de RSS a bytes requiere que descubras el tamaño de la página del kernel (muy probablemente 4096).
Aquí hay un código de ejemplo de cómo obtener el rss en kilobytes, funciona en Linux. No sé cómo hacer esto en OSX u otros sistemas.
module MemInfo
# This uses backticks to figure out the pagesize, but only once
# when loading this module.
# You might want to move this into some kind of initializer
# that is loaded when your app starts and not when autoload
# loads this module.
KERNEL_PAGE_SIZE = `getconf PAGESIZE`.chomp.to_i rescue 4096
STATM_PATH = "/proc/#{Process.pid}/statm"
STATM_FOUND = File.exist?(STATM_PATH)
def self.rss
STATM_FOUND ? (File.read(STATM_PATH).split('' '')[1].to_i * KERNEL_PAGE_SIZE) / 1024 : 0
end
end
# >> MemInfo.rss
# => 251944
La gema NewRelic proporciona implementaciones simples de uso de RSS para varios sistemas operativos y tiempos de ejecución ruby con su clase MemorySampler
.
Incluye la gema newrelic_rpm
en tu Gemfile
e newrelic_rpm
así:
NewRelic::Agent::Samplers::MemorySampler.new.sampler.get_sample
y devuelve el número de megabytes de memoria que contiene el proceso actual como RSS.
La implementación prefiere los contadores en proceso donde estén disponibles (jruby), use /proc/#{$$}/status
en Linux y vuelva a ps
cualquier otro lugar.
La gema OS tiene un método rss_bytes.
Puedes usar esta declaración de simple
puts ''RAM USAGE: '' + `pmap #{Process.pid} | tail -1`[10,40].strip