caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: orbitz@ezabel.com
To: "Richard W.M. Jones" <rich@annexia.org>
Cc: david.baelde@ens-lyon.org, Caml List <caml-list@inria.fr>
Subject: Re: [Caml-list] Understanding usage by the runtime
Date: Sun, 8 Jan 2012 17:50:40 -0500	[thread overview]
Message-ID: <B60C8CD8-5F88-476B-8F67-5FEB5165B271@ezabel.com> (raw)
In-Reply-To: <20120108184505.GA30498@annexia.org>

Thank you for the detailed response Rich.

Isn't the goal of compaction to keep all of these blocks of memory as close as possible?  I should have noted the fragmentation of my heap after compaction, but it seems unlikely that my < 1meg of actual data could be fragmented across 400megs worth of chunks.

> Here's the news: the OS doesn't need you to give back
> memory.  Because of virtual memory and swap, the OS will quite happily
> take back your memory whenever it wants without asking you. 

For most cases this is true, however in my case (which is not the usual case), my OS has no swap.  We actually prefer things to fail than to be swapped because we are doing computations could take months if we get into a swapping situation.  I'm no linux expert so our solution is to not have swap and to keep our VMs light when it comes to I/O.  Perhaps this is a poor solution but it does change things for us.

Thanks again Rich.


On Jan 8, 2012, at 1:45 PM, Richard W.M. Jones wrote:

> On Sat, Jan 07, 2012 at 12:43:22AM -0500, orbitz@ezabel.com wrote:
>> One question does remain though: In my tests I would do some work
>> that would cause ~1GB of RAM to be under control of the Gc.  Then I
>> would do something that, at the time I didn't understand, would case
>> the Gc to compact all of its memory and go back down to less than 1
>> meg, but the RES value in top would only drop to about 400 megs.  Is
>> this expected behavior?  I know the malloc implementation might hold
>> on to some data for itself but 400x the amount of memory the Ocaml RTS
>> actually needs seems a bit excessive.
> 
> I would say it's unusual, but not necessarily unexpected.
> 
> You have to understand (a) how C malloc works, (b) under what
> conditions memory may be given back to the OS, and (c) whether it's
> even necessary to give back memory to the OS.
> 
> Now (a) depends on what malloc implementation you're using.  We can
> assume it's Linux glibc, although even that has changed several times,
> so it really depends on which precise version of glibc you've got, but
> for this discussion I'll assume it's the latest version.  All of these
> details could be completely different for other operating systems ...
> 
> glibc currently has three strategies to allocate memory.
> 
> . For small amounts (under 512 bytes in the current impl) it has a
>  linked list of cached blocks of fixed sizes that are used to satisfy
>  requests quickly.
> 
> . For medium amounts (512 - 128K, adjustable) it has a complex
>  algorithm described as a combination of best fit and LRU.
> 
> . For large allocations (128K and over, but tunable), it uses mmap.
> 
> Furthermore, for allocations < 128K, when more core is required from
> the OS, it will either use sbrk(2) to increase the heap linearly, or
> it will use mmap(2) to allocate >= 1MB chunks scattered around the
> address space.
> 
> Basically what this means for (b) is that it's phenomenally hard to
> predict if it will be possible to give back memory to the OS.  It
> depends on how the OCaml runtime requested it (what size, what order
> of requests).  It will depend on how random C allocations (libraries
> and the OCaml runtime) happen to be spread around, since those cannot
> be moved and will prevent memory from being given back.  And it will
> depend on the malloc control structures themselves which also cannot
> be moved and their location will be highly dependent on the order in
> which requests were made (maybe even not predictable if you have a
> multithreaded program).  It may be that just one struct is preventing
> a whole mmapped area from being given back.
> 
> So you might think that your program "just allocated 1GB of RAM and
> freed it" at the OCaml level, but what's happening at the allocator
> level is likely to be far more complex.
> 
> And that brings us to (c): does it even make sense to give back memory
> to the OS?  Here's the news: the OS doesn't need you to give back
> memory.  Because of virtual memory and swap, the OS will quite happily
> take back your memory whenever it wants without asking you.  It could
> even be more efficient this way.
> 
> Rich.
> 
> -- 
> Richard Jones
> Red Hat



  parent reply	other threads:[~2012-01-08 22:50 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-30 23:45 orbitz
2011-12-31  9:11 ` David Baelde
2011-12-31 15:33   ` orbitz
2012-01-01 12:44     ` Richard W.M. Jones
2012-01-04 18:03       ` Damien Doligez
2012-01-04 18:48         ` Adrien
2012-01-04 19:37           ` John Carr
2012-01-07  5:43       ` orbitz
2012-01-08 18:45         ` Richard W.M. Jones
2012-01-08 19:00           ` Richard W.M. Jones
2012-01-08 22:33             ` Török Edwin
2012-01-09 14:31               ` Richard W.M. Jones
2012-01-09 21:07                 ` Richard W.M. Jones
2012-01-08 22:50           ` orbitz [this message]
2012-01-08 23:02             ` Richard W.M. Jones
2012-01-08 23:26               ` orbitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B60C8CD8-5F88-476B-8F67-5FEB5165B271@ezabel.com \
    --to=orbitz@ezabel.com \
    --cc=caml-list@inria.fr \
    --cc=david.baelde@ens-lyon.org \
    --cc=rich@annexia.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).