[pypy-dev] Problem with large allocation in test

pypy at pocketnix.org pypy at pocketnix.org
Tue Apr 19 00:59:26 CEST 2011


On Mon, Apr 18, 2011 at 06:25:44PM -0400, Joe wrote:
> I was trying to run the test file:
> pypy/jit/backend/x86/test/test_rx86_64_auto_encoding.py
> 
> and was getting the following traceback:
> http://paste.pocoo.org/show/374129/
> 
> If you look at the comment on line 17, it's trying to allocate much
> more memory than I have.  I think it's a total of 21GB, while I only
> have 4GB.  I'm using 64bit OpenSuSE 11.4 for my operating system. I
> had the kernel setting overcommit_memory set to 0 (which may be part
> of the problem).
> 
> Anyway, after I went into ll2ctypes.py and set far_regions to True, I
> was able to successfully run the original test.  I don't think setting
> far_regions to True is the correct solution to the problem, but
> fiddling with kernel settings on my system is not ideal either.  What
> would be a better overall solution?
> 
> If any clarification is needed let me know,
> Joe


your vm.overcommit_ratio should be set to "50" or 50% by default, as 
per 
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=Documentation/vm/overcommit-accounting;hb=HEAD 
this means that any allocations of 6GB will automatically be rejected 
as "not sane" and you should receive the ENOMEM error indicating the 
kernel cannot satisfy the supplied range

there are a couple of ways to fix this 

* don't allocate so much ram (did anyone test this before on a 64bit 
host on linux)

* change the vm overcommit policy to 1 (allow everything, don't perform 
sanity checks)

* change the overcommit ratio to something that will satisfy the 
allocation (20GB/4GB ~= 5x, so a value of 600% or 600 should do it)

* Make the mapping a rmmap.MAP_PRIVATE and rmmap.PROT_READ only, 
depending on what you are testing this may not be useful as indicated 
in the linked kernel documentation

YYMV, first option is safe, 2nd option you may want to double check 
the documentation and the values you are passing, the 3rd option is 
also safe in that it will allow badly behaved apps to run, not prevent 
apps from running


to change either of these values use the following:

* to adjust the allocation policy:
  sysctl vm.overcommit_memory=<val>

* to adjust the ratio:
  sysctl vm.overcommit_ratio=<val>

to print the current values (and save them for restoring them after 
you have done tweaking them:
  sysctl vm.overcommit_memory
or
  sysctl vm.overcommit_ratio


Hope this is whats causing the issue
Da_Blitz



More information about the Pypy-dev mailing list