Skip to content

Instantly share code, notes, and snippets.

@authorNari
Forked from wr0ngway/gc-cow.rb
Created March 24, 2012 00:38
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save authorNari/2176775 to your computer and use it in GitHub Desktop.
Save authorNari/2176775 to your computer and use it in GitHub Desktop.
test to see if GC in ruby 2 is truly copy on write friendly
#!/usr/bin/env ruby
rss = '.+?Rss:\s+(\d+)'
share = '.+?Shared_Clean:\s+(\d+)'
share << '.+?Shared_Dirty:\s+(\d+)'
priv = '.+?Private_Clean:\s+(\d+)'
priv << '.+?Private_Dirty:\s+(\d+)'
MEM_REGEXP = /\[heap\]#{rss}#{share}#{priv}/m
def mem_usage()
if File.read("/proc/#{Process.pid}/smaps").match(MEM_REGEXP)
rss = $1.to_i
share = $2.to_i + $3.to_i
priv = $4.to_i + $5.to_i
end
"RSS: #{rss} kB, Shared: #{share} kB, Private: #{priv} kB"
end
puts "parent (#{Process.pid}) baseline memory: #{mem_usage}"
alloc=10000 * 2 ** 10
puts "parent allocating #{alloc} objects"
a = []
alloc.times do
a << Object.new
end
puts "parent allocated, mem usage: #{mem_usage}"
GC.start
GC.start
GC.start
puts "parent GC'd, mem usage: #{mem_usage}"
sleep 2
if fork
puts "parent (#{Process.pid}) GC'd and sleeping, mem usage: #{mem_usage}"
sleep 40
else
puts "child (#{Process.pid}) forked, mem usage: #{mem_usage}"
GC.start
GC.start
GC.start
puts "child (#{Process.pid}) GC'd and sleeping, mem usage: #{mem_usage}"
sleep 30
end
% ruby -v
ruby 2.0.0dev (2012-03-23 trunk 35121) [x86_64-linux]
exit status: 0
% ruby gc-cow.rb
parent (16718) baseline memory: RSS: 2552 kB, Shared: 0 kB, Private: 2552 kB
parent allocating 10240000 objects
parent allocated, mem usage: RSS: 442784 kB, Shared: 0 kB, Private: 442784 kB
parent GC'd, mem usage: RSS: 446920 kB, Shared: 0 kB, Private: 446920 kB
parent (16718) GC'd and sleeping, mem usage: RSS: 446952 kB, Shared: 446908 kB, Private: 44 kB
child (16738) forked, mem usage: RSS: 446952 kB, Shared: 446908 kB, Private: 44 kB
child (16738) GC'd and sleeping, mem usage: RSS: 446976 kB, Shared: 442636 kB, Private: 4340 kB
---
% ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
% ruby gc-cow.rb
parent (17090) baseline memory: RSS: 2456 kB, Shared: 0 kB, Private: 2456 kB
parent allocating 10240000 objects
parent allocated, mem usage: RSS: 439196 kB, Shared: 0 kB, Private: 439196 kB
parent GC'd, mem usage: RSS: 439252 kB, Shared: 0 kB, Private: 439252 kB
child (17102) forked, mem usage: RSS: 439288 kB, Shared: 439252 kB, Private: 36 kB
parent (17090) GC'd and sleeping, mem usage: RSS: 439288 kB, Shared: 439252 kB, Private: 36 kB
child (17102) GC'd and sleeping, mem usage: RSS: 439312 kB, Shared: 1564 kB, Private: 437748 kB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment