ruby memory process

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