* 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
				
			
		|  | @ -284,7 +284,7 @@ AC_CHECK_FUNCS([setresuid setreuid lchown]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Nice to have, but not essential. | # Nice to have, but not essential. | ||||||
| AC_CHECK_FUNCS([strsignal posix_fallocate nanosleep]) | AC_CHECK_FUNCS([strsignal posix_fallocate nanosleep sysconf]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # This is needed if ATerm or bzip2 are static libraries, | # This is needed if ATerm or bzip2 are static libraries, | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ | ||||||
| #include "globals.hh" | #include "globals.hh" | ||||||
| 
 | 
 | ||||||
| #include <cstring> | #include <cstring> | ||||||
|  | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
| #if HAVE_BOEHMGC | #if HAVE_BOEHMGC | ||||||
| 
 | 
 | ||||||
|  | @ -155,17 +156,29 @@ EvalState::EvalState() | ||||||
| #if HAVE_BOEHMGC | #if HAVE_BOEHMGC | ||||||
|     static bool gcInitialised = true; |     static bool gcInitialised = true; | ||||||
|     if (gcInitialised) { |     if (gcInitialised) { | ||||||
|         /* Set the initial heap size to something fairly big (384 MiB)
 |         /* Set the initial heap size to something fairly big (25% of
 | ||||||
|            so that in most cases we don't need to garbage collect at |            physical RAM, up to a maximum of 384 MiB) so that in most | ||||||
|            all.  (Collection has a fairly significant overhead.)  The |            cases we don't need to garbage collect at all.  (Collection | ||||||
|            heap size can be overriden through libgc's |            has a fairly significant overhead.)  The heap size can be | ||||||
|            GC_INITIAL_HEAP_SIZE environment variable.  We should |            overriden through libgc's GC_INITIAL_HEAP_SIZE environment | ||||||
|            probably also provide a nix.conf setting for this.  Note |            variable.  We should probably also provide a nix.conf | ||||||
|            that GC_expand_hp() causes a lot of virtual, but not |            setting for this.  Note that GC_expand_hp() causes a lot of | ||||||
|            physical (resident) memory to be allocated.  This might be |            virtual, but not physical (resident) memory to be | ||||||
|            a problem on systems that don't overcommit. */ |            allocated.  This might be a problem on systems that don't | ||||||
|         if (!getenv("GC_INITIAL_HEAP_SIZE")) |            overcommit. */ | ||||||
|             GC_expand_hp(384 * 1024 * 1024); |         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; |         gcInitialised = true; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue