ruby-on-rails-3 – Rails 3 Heroku:找出dyno的内存使用情况

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – Rails 3 Heroku:找出dyno的内存使用情况前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法找出一个英雄网站dyno正在使用多少内存?假设我想编写一个定期运行的rake任务,并检查每个dyno的内存使用情况.我该怎么做?谢谢!

解决方法

我接受了接受的答案的建议,并实现了一个/ proc文件系统解析器与聚合&基于阈值的差异.我发现在调试Heroku上的一些 Ruby 2.0内存问题上非常有用.获得 code,也包括在这里为了方便.
  1. # Memory snapshot analyzer which parses the /proc file system on *nix
  2. #
  3. # Example (run in Heroku console):
  4. #
  5. # ms = MemorySnapshot.new
  6. # 1.upto(10000).map { |i| Array.new(i) }; nil
  7. # ms.snapshot!; nil
  8. # ms.diff 10
  9. # => {"lib/ld-2.11.1.so"=>156,"heap"=>2068,"all"=>2224}
  10. #
  11. class MemorySnapshot
  12.  
  13. attr_reader :prevIoUs
  14. attr_reader :current
  15.  
  16. def initialize
  17. snapshot!
  18. @prevIoUs = @current
  19. end
  20.  
  21. # Generates a Hash of memory elements mapped to sizes of the elements in Kb
  22. def snapshot!
  23. @prevIoUs = @current
  24. @current = reduce(names_with_sizes)
  25. end
  26.  
  27. # Calculates the difference between the prevIoUs and the current snapshot
  28. # Threshold is a minimum delta in kilobytes required to include an entry
  29. def diff(threshold = 0)
  30. self.class.diff_between prevIoUs,current,threshold
  31. end
  32.  
  33. # Calculates the difference between two memory snapshots
  34. # Threshold is a minimum delta in kilobytes required to include an entry
  35. def self.diff_between(before,after,threshold)
  36. names = (before.keys + after.keys).uniq
  37. names.reduce({}) do |memo,name|
  38. delta = after.fetch(name) { 0 } - before.fetch(name) { 0 }
  39. memo[name] = delta if delta.abs >= threshold
  40. memo
  41. end
  42. end
  43.  
  44. private
  45.  
  46. def reduce(matches)
  47. total = 0
  48. current_name = nil
  49. matches.reduce(Hash.new { 0 }) do |memo,match|
  50. current_name = match[:name] || current_name
  51. size = match[:size].to_i
  52. total += size
  53. memo[current_name] += size
  54. memo
  55. end.tap { |snapshot| snapshot['all'] = total }
  56. end
  57.  
  58. def names_with_sizes
  59. smap_entries.map do |line|
  60. /((^(\/|\[)(?<name>[^ \]]+)\]?\s+)|(^))(?<size>\d+)\s/.match(line)
  61. end
  62. end
  63.  
  64. def smap_entries
  65. smaps.
  66. gsub(/^(([^Sa-f0-9])|(S[^i]))[^\n]+\n/m,'').
  67. gsub(/\nSize:/m,'').
  68. gsub(/[0-9a-f]+-[0-9a-f]+.{6}[0-9a-f]+ [0-9a-f]+:[0-9a-f]+ [0-9a-f]+\s+/i,'').
  69. split("\n")
  70. end
  71.  
  72. def smaps
  73. File.read("/proc/#{Process.pid}/smaps")
  74. end
  75. end

猜你在找的Ruby相关文章