Hi,
Following one of my blog post[1] about Puppetd memory consumption, I
decided to also try to add my stone to the edifice.
Since #2892 is almost fixed by now, I decided to spend my time on
something else:
1) json catalog (and its deserialization)
2) sourced file content
Those two things can consume memory for a short time (memory which unfortunately
is always consumed, see my blog post for some explanations).
So this patch brings to puppet:
1) support for a new Json parser: Yajl-ruby[1], which is faster and uses
less memory than the regular json parser. Yajl-ruby is available as a gem.
To activate the support it is needed to use
--preferred_serialization_format=yajl
2) use Yajl-ruby in "streaming" mode: puppetd never reads the whole response
body in ram, but instead feeds Yajl-ruby chunk by chunk. This way, the json
serialized catalog is never fully stored in RAM.
3) allow the file resource source system to stream file content to disk instead
of reading the whole response body in RAM and then dumping it on file.
This patch has been lightly tested and seems to work, YMMV, though. I also
tried for the patch to be as minimal as possible.
I took some figures while puppetd was sourcing a 100MiB file:
Start Peak
0.25.4 VSZ 612860 925772
patched VSZ 611936 644104
0.25.4 RES 12988 298104
patched RES 11704 43536
Which I think speaks for itself :-)
Now to be clear: this patch is a quick and dirty hack, I don't expect it to be
merged as is, so I'm waiting reviews, tests, comments, flames. I even think
this patch brings a lot whole new serie of issues and bugs :-)
Note: this patch introduces a new issue, regarding #2892, since we don't have
anymore the whole serialized catalog in memory, it will be hard dump it as is
to disk for the local cache. Something clever will need to be done (like
streaming
the cache...).
Thanks,
Brice
[1]:
http://www.masterzen.fr/2010/01/28/puppet-memory-usage-not-a-fatality/
[2]:
http://github.com/brianmario/yajl-ruby
Brice Figureau (5):
Add stream format capability
Add Yajl-ruby json parser format
Add a way to capture checksums on a "stream"
Let the rest client know how to handle stream response
Allows puppet:// content client streaming
lib/puppet/feature/yajl.rb | 24 ++++
lib/puppet/file_serving/content_stream.rb | 23 +++
lib/puppet/indirector/file_content/rest.rb | 10 ++-
lib/puppet/indirector/rest.rb | 14 ++-
lib/puppet/network/deferred_response.rb | 94 +++++++++++++
lib/puppet/network/format.rb | 4 +
lib/puppet/network/format_handler.rb | 23 +++-
lib/puppet/network/formats.rb | 112 +++++++++++++++
lib/puppet/network/response_stream.rb | 45 ++++++
lib/puppet/resource.rb | 2 +-
lib/puppet/type/file.rb | 19 +++-
lib/puppet/util/checksum_stream.rb | 20 +++
lib/puppet/util/checksums.rb | 12 ++
spec/integration/network/deferred_response.rb | 34 +++++
spec/integration/network/formats.rb | 82 +++++++++++-
spec/unit/file_serving/content_stream.rb | 29 ++++
spec/unit/indirector/file_content/rest.rb | 30 ++++-
spec/unit/indirector/rest.rb | 45 ++++---
spec/unit/network/deferred_response.rb | 182 +++++++++++++++++++++++++
spec/unit/network/format.rb | 4 +
spec/unit/network/format_handler.rb | 33 +++++
spec/unit/network/formats.rb | 110 +++++++++++++++-
spec/unit/network/response_stream.rb | 60 ++++++++
spec/unit/type/file.rb | 32 +++++
spec/unit/util/checksum_stream.rb | 23 +++
spec/unit/util/checksums.rb | 12 ++
26 files changed, 1040 insertions(+), 38 deletions(-)
create mode 100644 lib/puppet/feature/yajl.rb
create mode 100644 lib/puppet/file_serving/content_stream.rb
create mode 100644 lib/puppet/network/deferred_response.rb
create mode 100644 lib/puppet/network/response_stream.rb
create mode 100644 lib/puppet/util/checksum_stream.rb
create mode 100644 spec/integration/network/deferred_response.rb
create mode 100644 spec/unit/file_serving/content_stream.rb
create mode 100644 spec/unit/network/deferred_response.rb
create mode 100644 spec/unit/network/response_stream.rb
create mode 100644 spec/unit/util/checksum_stream.rb
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en.