[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MirageOS-devel] Out of memory



On 18 December 2015 at 09:48, David Scott <scott.dj@xxxxxxxxx> wrote:
> Hi Thomas,
>
> On Thu, Dec 17, 2015 at 4:59 PM, Thomas Leonard <talex5@xxxxxxxxx> wrote:
>>
>> I've been trying to track down some occasional out-of-memory errors
>> with my Mirage/Xen unikernel. My simplified code does this:
>>
>> let start ... =
>>     ...
>>     let rec loop () =
>>       let open Bigarray in
>>       let x = Array1.create Char c_layout 1024 in
>>       (* Gc.minor (); *)
>>       ignore x;
>>       loop () in
>>     loop ()
>>
>> (note: Cstruct.create uses Array1.create internally)
>>
>> When run, memory usage (as measured by mini-os's page allocator) rises
>> from about a third at the start to 100%, and then it dies:
>>
>> [init]
>> mm: 2491/7642 (32.6 %)
>> mm: 2493/7642 (32.6 %)
>> [...]
>> mm: 7638/7642 (99.9 %)
>> mm: 7639/7642 (100.0 %)
>> mm: 7640/7642 (100.0 %)
>> mm: 7641/7642 (100.0 %)
>> mm: 7642/7642 (100.0 %)
>> Cannot handle page request order 0!
>> Fatal error: exception Out of memory
>> Raised at file "src/core/lwt.ml", line 901, characters 22-23
>> Called from file "lib/main.ml", line 58, characters 10-20
>> Called from file "main.ml", line 33, characters 6-58
>> Re-raised at file "main.ml", line 36, characters 10-12
>> Mirage exiting with status 2
>> Do_exit called!
>>
>> If the Gc.minor () line is uncommented then it works.
>>
>> The C code in caml_ba_alloc does:
>>
>>     data = malloc(size);
>>     if (data == NULL && size != 0) caml_raise_out_of_memory();
>>
>> I guess we should do a GC.full_major here and retry, right? Should
>> this be changed upstream in OCaml itself?
>
>
> Interestingly we've caught this (and done a -- perhaps OTT -- Gc.compact)
> here:
>
> https://github.com/mirage/io-page/blob/1a489eb5ac2bdabbc08e142622ad061b83df0e2e/lib/io_page.ml#L36
>
> I guess we never considered that code would make heavy use of big arrays in
> other contexts.

Yes. I think any use of malloc from C code is incorrect without some
GC-and-retry logic. If we want to embed larger C programs in Mirage
we'd probably want to wrap malloc somehow for them.

> It would be nice if the OCaml code did a Gc before failing, just like it
> would do if an allocation from the minor heap failed because it was full.

I've reproduced it on Linux and reported it here:

  http://caml.inria.fr/mantis/view.php?id=7100


-- 
Dr Thomas Leonard        http://roscidus.com/blog/
GPG: DA98 25AE CAD0 8975 7CDA  BD8E 0713 3F96 CA74 D8BA

_______________________________________________
MirageOS-devel mailing list
MirageOS-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.