* Don't allocate a big initial GC address space on machines with
little RAM. Even if the memory isn't actually used, it can cause problems with the overcommit heuristics in the kernel. So use a VM space of 25% of RAM, up to 384 MB.
This commit is contained in:
		
							parent
							
								
									5a6b039802
								
							
						
					
					
						commit
						538b7caab0
					
				
					 2 changed files with 25 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -7,6 +7,7 @@
 | 
			
		|||
#include "globals.hh"
 | 
			
		||||
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#if HAVE_BOEHMGC
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,17 +156,29 @@ EvalState::EvalState()
 | 
			
		|||
#if HAVE_BOEHMGC
 | 
			
		||||
    static bool gcInitialised = true;
 | 
			
		||||
    if (gcInitialised) {
 | 
			
		||||
        /* Set the initial heap size to something fairly big (384 MiB)
 | 
			
		||||
           so that in most cases we don't need to garbage collect at
 | 
			
		||||
           all.  (Collection has a fairly significant overhead.)  The
 | 
			
		||||
           heap size can be overriden through libgc's
 | 
			
		||||
           GC_INITIAL_HEAP_SIZE environment variable.  We should
 | 
			
		||||
           probably also provide a nix.conf setting for this.  Note
 | 
			
		||||
           that GC_expand_hp() causes a lot of virtual, but not
 | 
			
		||||
           physical (resident) memory to be allocated.  This might be
 | 
			
		||||
           a problem on systems that don't overcommit. */
 | 
			
		||||
        if (!getenv("GC_INITIAL_HEAP_SIZE"))
 | 
			
		||||
            GC_expand_hp(384 * 1024 * 1024);
 | 
			
		||||
        /* Set the initial heap size to something fairly big (25% of
 | 
			
		||||
           physical RAM, up to a maximum of 384 MiB) so that in most
 | 
			
		||||
           cases we don't need to garbage collect at all.  (Collection
 | 
			
		||||
           has a fairly significant overhead.)  The heap size can be
 | 
			
		||||
           overriden through libgc's GC_INITIAL_HEAP_SIZE environment
 | 
			
		||||
           variable.  We should probably also provide a nix.conf
 | 
			
		||||
           setting for this.  Note that GC_expand_hp() causes a lot of
 | 
			
		||||
           virtual, but not physical (resident) memory to be
 | 
			
		||||
           allocated.  This might be a problem on systems that don't
 | 
			
		||||
           overcommit. */
 | 
			
		||||
        if (!getenv("GC_INITIAL_HEAP_SIZE")) {
 | 
			
		||||
            size_t maxSize = 384 * 1024 * 1024;
 | 
			
		||||
            size_t size = 32 * 1024 * 1024;
 | 
			
		||||
#if HAVE_SYSCONF && defined(_SC_PAGESIZE) && defined(_SC_PHYS_PAGES)
 | 
			
		||||
            long pageSize = sysconf(_SC_PAGESIZE);
 | 
			
		||||
            long pages = sysconf (_SC_PHYS_PAGES);
 | 
			
		||||
            if (pageSize != -1 && size != -1)
 | 
			
		||||
                size = (pageSize * pages) / 4; // 25% of RAM
 | 
			
		||||
            if (size > maxSize) size = maxSize;
 | 
			
		||||
#endif
 | 
			
		||||
            debug(format("setting initial heap size to %1% bytes") % size);
 | 
			
		||||
            GC_expand_hp(size);
 | 
			
		||||
        }
 | 
			
		||||
        gcInitialised = true;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue