This paragraph is motivation. While my question is not Rails-specific, I
am
asking it because of Rails. I’ve been investigating the memory footprint
of
my Mongrels. It is nice that they share the .so libraries from
ImageMagick
as well as other C libraries. However, each one still has about 20MB in
[heap]. My theory is that a lot of this is coming from ActiveRecord and
friends getting loaded again and again for each Mongrel, which seems to
me
entirely unnecessary. My “marginal cost of Apache” is 1376kB. My
“marginal
cost of Mongrel” is 27528kB, with the code I wrote. It seems that the
latter
could be reduced a lot by sharing some Ruby libraries.
The question is as follows: if I require ‘library’ in one instance of
Ruby
and then require ‘library’ again in another instance of Ruby, then do I
get
duplicate copies of library’s code in two chunks of my RAM? (I’m
thinking I
do.) Why?
For further details and perhaps clarification, consider the following
script:
require ‘smaps_parser’
smaps = SmapsParser.new(Process.pid)
puts smaps.sums.inspect
%w{rubygems active_record action_controller action_view RMagick}.each do
|l|
puts “\nRequiring #{l}.”
require l
smaps.refresh
puts smaps.sums.inspect
end
Though my Mongrel processes have already (each?) loaded copies of each
l,
and though there is nothing “private” about the code in each l, I get
the
following output, in which one should pay particular attention to the
increase of [:private_dirty]:
{:rss=>1520, :shared_clean=>964, :shared_dirty=>0, :private_clean=>12,
:size=>2968, :private_dirty=>544}
Requiring rubygems.
{:rss=>5032, :shared_clean=>1676, :shared_dirty=>0, :private_clean=>224,
:size=>7476, :private_dirty=>3132}
Requiring active_record.
{:rss=>12920, :shared_clean=>1816, :shared_dirty=>0,
:private_clean=>224,
:size=>15452, :private_dirty=>10880}
Requiring action_controller.
{:rss=>18680, :shared_clean=>1828, :shared_dirty=>0,
:private_clean=>228,
:size=>21152, :private_dirty=>16624}
Requiring action_view.
{:rss=>21088, :shared_clean=>1828, :shared_dirty=>0,
:private_clean=>228,
:size=>23524, :private_dirty=>19032}
Requiring RMagick.
{:rss=>22512, :shared_clean=>2660, :shared_dirty=>0,
:private_clean=>228,
:size=>29792, :private_dirty=>19624}