web-dev-qa-db-fra.com

Obtenir l'actuelle Ruby

Je voudrais formater ma sortie Logger pour inclure l'utilisation actuelle de la mémoire, pour une partie d'un processus de longue durée.

Y a-t-il quelque chose de intégré à Ruby pour cela, un peu comme PHP memory_get_usage() ? Ou dois-je exécuter quelques commandes Shell pour obtenir depuis ps?

51
d11wtq

En essayant de résoudre ce problème il y a un an, j'ai fait beaucoup de recherches en ligne et de recherche d'API et n'ai pu le résoudre que via un appel système à ps.

Sous OS X 10.7.2 et Red Hat 4.1.2-13 (sur EC2):

pid, size = `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)

Cela récupère et place la taille de la mémoire résidente du processus en kilo-octets dans la variable de taille.

Avec un peu d'effort, cela pourrait être nettoyé, mais la plupart du temps est passé à appeler ps et à capturer sa sortie, donc je ne pense pas que cela en vaille la peine.

31
Paploo

La gemme NewRelic fournit des implémentations simples d'utilisation RSS pour un certain nombre de systèmes d'exploitation et Ruby runtimes avec leur MemorySampler class .

Inclure le newrelic_rpm gem dans votre Gemfile et l'invoquez ainsi:

NewRelic::Agent::Samplers::MemorySampler.new.sampler.get_sample

et il retourne le nombre de mégaoctets de mémoire que le processus actuel détient en tant que RSS.

L'implémentation préfère les compteurs in-process lorsqu'ils sont disponibles (jruby), utilisez le /proc/#{$$}/status sous Linux et revenir à ps partout ailleurs.

35
rud

L'utilisation de commandes externes sur Ruby comme ps en utilisant des raccourcis va bifurquer le processus en cours pendant la durée d'exécution de la commande. Cela signifie que si votre processus Ruby consomme 300 Mo, vous aurez besoin de 300 Mo supplémentaires uniquement pour exécuter l'une de ces solutions `ps -o rss #{$$}`.strip.split.last.to_i.

Sur les systèmes Linux, vous pouvez obtenir des informations sur la mémoire du processus en lisant /proc/PID/statm. Le deuxième champ est le Resident Set Size en nombre de pages du noyau. Pour convertir les pages RSS en octets, vous devez déterminer la taille de la page du noyau (très probablement 4096).

Voici un exemple de code pour obtenir le rss en kilo-octets, fonctionne sur Linux. Je ne sais pas comment faire cela sur OSX ou d'autres systèmes.

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
12
Kimmo Lehto

Le gem OS a une méthode rss_bytes.

7
rogerdpack

Vous pouvez simplement utiliser cette instruction put

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
6
apandey846