bug in mallocForeignPtrBytes (both 6.4 and 6.6)

Simon Peyton-Jones simonpj at microsoft.com
Wed Sep 27 10:34:02 EDT 2006


I added notes about this to 
	http://haskell.org/haskellwiki/Performance/GHC

S

| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org
[mailto:glasgow-haskell-users-bounces at haskell.org]
| On Behalf Of Simon Marlow
| Sent: 27 September 2006 13:44
| To: Duncan Coutts
| Cc: glasgow-haskell-users at haskell.org
| Subject: Re: bug in mallocForeignPtrBytes (both 6.4 and 6.6)
| 
| Duncan Coutts wrote:
| > On Sun, 2006-09-24 at 01:28 +0400, Bulat Ziganshin wrote:
| >
| >>Hello Duncan,
| >>
| >>Sunday, September 24, 2006, 12:22:38 AM, you wrote:
| >>
| >>
| >>>>after program prints "40 mb allocated" look at Task Manager
indication
| >>>>- it shows that two times more memory actually in use. it seems
that
| >>>>problem is only with allocating memory buffers whose sizes are
powers
| >>>>of 2 or very close - bug shows for bufsize = 4kb, 1mb or 4095, but
not
| >>>>not for 4000 or 10^6
| >>
| >>>The reason for this is that for larger objects ghc has an
allocation
| >>>granularity of 4k. That is it always uses a multiple of 4k bytes.
| >>
| >>with 512k blocks it also allocates two times more data than
requested.
| >
| > Oh, sorry I missed that point. Something fishy is going on then.
| 
| Duncan's explanation works for allocating 4k, but there's another
explanation
| for larger blocks.  GHC allocates memory from the OS in units of a
"megablock"
| (see http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage),
currently
| 1Mb.  So if you allocate a 1Mb array, the storage manager has to
allocate 1Mb +
| overhead, which will cause it to allocate a 2Mb megablock.  The
surplus will be
| returned to the system in the form of free blocks, but if all you do
is allocate
| lots of 1Mb arrays, you'll waste about half the sapce because there's
never
| enough contiguous free space to contain another 1Mb array.  Similar
problem for
| 512k arrays: the storage manager allocates a 1Mb block, and returns
slightly
| less than half of it as free blocks, so each 512k allocation takes a
whole new
| 1Mb block.
| 
| Cheers,
| 	Simon
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


More information about the Glasgow-haskell-users mailing list