V8 suffered from a virtual address space leak which was fixed and backmerged to 57 (https://bugs.chromium.org/p/v8/issues/detail?id=5945).
Awesome it works for you now. On Thu, May 11, 2017 at 7:04 PM Andre Cunha <andre.lv.cu...@gmail.com> wrote: > I have repeated the tests in V8 5.8.283.38, and indeed the problem is > gone. The amount of virtual memory remains stable over time. > > With regard to the cause of the problem, I managed to create a similar > situation (increase in virtual memory consumption without increase in > actual memory usage) using a loop like this: > > while (true) { > usleep(100); > sbrk(4096 * 40); > } > > I would guess that, in version 5.6, the program break of the process was > being increased when an Isolate was allocated, some allocated pages were > not being used, but the program break wasn't being decreased when > Isolate::Dispose() was called. The memory the Isolate used to occupy was > nonetheless marked free, and thus reused in subsequent allocations, but the > allocation process would still increase the program break anyway. Since > these extra pages were never referenced, no actual memory was allocated to > the process, but the program break reached its limit at some point. That > could explain the situation, but it's just a wild guess, and the problem is > solved in 5.8 anyway. > > Thank you for the support. > Andre > > On Thursday, May 11, 2017 at 10:45:30 AM UTC-3, Jakob Kummerow wrote: >> >> On Thu, May 11, 2017 at 3:38 PM, Jochen Eisinger <joc...@chromium.org> >> wrote: >> >>> Thank you for the detailed bug report. >>> >>> I tried reproducing this on the latest version of V8, but couldn't >>> observe the behavior you described. >>> >>> Have you considered updating to at least the latest stable version of V8? >>> >> >> ...which would be branch-heads/5.8 (currently 5.8.283.38) >> >> > >>> On Wed, May 10, 2017 at 7:50 PM Andre Cunha <andre.l...@gmail.com> >>> wrote: >>> >>>> I've managed to reproduce the problem using just V8's hello_world >>>> example (source code attached). I just added a loop around the creation and >>>> destruction of the Isolate (this is what happens in each cycle of my stress >>>> test). When I run the process and monitor it in "top", the RES column stays >>>> constant at around 26 MB, but the VIRT column grows indefinitely; after >>>> about 7 minutes, the VIRT column reaches around 33 GB, and the process >>>> crashes (the value of "CommitLimit" in my machine, got from /proc/meminfo, >>>> is 35,511,816 kB). >>>> >>>> Following Michael's suggestion, I changed file src/heap/spaces.cc so >>>> that it prints a stack trace when it's about to return NULL. I'm also >>>> sending the stack trace attached. I use V8 5.6.326.42 in Fedora 25, x86_64. >>>> >>>> Just to explain why I'm doing this test: in the library I'm working on, >>>> the user can create a certain kind of thread and send requests to it. Each >>>> thread needs to run JS code (received from the user), so it creates its own >>>> Isolate when it needs to, and destroys it when the Isolate is no longer >>>> necessary. One of our stress tests involves the constant creation and >>>> destruction of such threads, as well as constantly sending requests to the >>>> same thread. It was in this context that I found this problem. >>>> >>>> On Monday, May 8, 2017 at 12:50:37 PM UTC-3, Andre Cunha wrote: >>>>> >>>>> @Michael Lippautz, I'll try adding a breakpoint if AllocateChunk >>>>> returns NULL; hopefully, I'll get more information about the problem. >>>>> >>>>> @Jakob Kummerow, yes, I'm calling Isolate::Dispose() in every isolate >>>>> after using it. I'll also observe the VIRT column and see if it shows any >>>>> abnormality. >>>>> >>>>> Thank you! >>>>> >>>>> On Monday, May 8, 2017 at 11:07:44 AM UTC-3, Jakob Kummerow wrote: >>>>>> >>>>>> My guess would be an address space leak (should show up in the "VIRT" >>>>>> column of "top" on Linux). Are you calling "isolate->Dispose()" on any >>>>>> isolate you're done with? >>>>>> >>>>>> On Mon, May 8, 2017 at 4:01 PM, Michael Lippautz < >>>>>> mlip...@chromium.org> wrote: >>>>>> >>>>>>> V8 usually fails there if it cannot allocate a 512KiB page from the >>>>>>> operating system/ >>>>>>> >>>>>>> You could try hooking in AllocateChunk [1] and see why it is >>>>>>> returning NULL and trace back through the underlying calls. >>>>>>> >>>>>>> Best, Michael >>>>>>> >>>>>>> [1]: >>>>>>> https://cs.chromium.org/chromium/src/v8/src/heap/spaces.cc?q=AllocateChunk&sq=package:chromium&l=739 >>>>>>> >>>>>>> On Mon, May 8, 2017 at 3:27 PM Andre Cunha <andre.l...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hello, >>>>>>>> >>>>>>>> I have embedded v8 into a project for the company I work for, and >>>>>>>> during some stress tests, I've encountered a weird out-of-memory error. >>>>>>>> After considerable investigation, I still have no idea of what might be >>>>>>>> going on, so I'm reaching out to you in hope of some insight. >>>>>>>> >>>>>>>> So here is a summary of the scenario: in each test iteration, I >>>>>>>> create an Isolate, run some short JS code fragments, and then destroy >>>>>>>> the >>>>>>>> isolate. After the execution of each code fragment, I perform some >>>>>>>> variable >>>>>>>> manipulations from my C++ code using V8's API, prior to running the >>>>>>>> next >>>>>>>> fragment. I repeat thousands of such iterations over the same input >>>>>>>> (it's >>>>>>>> valid), and I expect no memory leaks and no crashes. However, after >>>>>>>> about 3 >>>>>>>> hours, V8 crashes with an out-of-memory error of no apparent reason. >>>>>>>> >>>>>>>> I have run the code though valgrind and using address sanitizing, >>>>>>>> and no memory leaks were detected. Additionally, I monitor memory >>>>>>>> consumption throughout the test; the program's memory usage is stable, >>>>>>>> without any peak, and when V8 crashes the system has a lot of available >>>>>>>> memory (more than 5 Gib). I have used V8's API to get heap usage >>>>>>>> statistics >>>>>>>> after each successful iteration; the values are always the same, and >>>>>>>> are >>>>>>>> shown below (they are included in an attached file, >>>>>>>> typical_memory.txt): >>>>>>>> >>>>>>>> ScriptEngine::Run: finished running at 2017-05-05T13:20:34 >>>>>>>> used_heap_size : 46.9189 Mib >>>>>>>> total_heap_size : 66.1562 Mib >>>>>>>> Space 0 >>>>>>>> name : new_space >>>>>>>> size : 8 Mib >>>>>>>> used_size : 2.47314 Mib >>>>>>>> available_size : 5.39404 Mib >>>>>>>> Space 1 >>>>>>>> name : old_space >>>>>>>> size : 39.5625 Mib >>>>>>>> used_size : 31.6393 Mib >>>>>>>> available_size : 5.51526 Mib >>>>>>>> Space 2 >>>>>>>> name : code_space >>>>>>>> size : 10.4375 Mib >>>>>>>> used_size : 6.16919 Mib >>>>>>>> available_size : 0 B >>>>>>>> Space 3 >>>>>>>> name : map_space >>>>>>>> size : 8.15625 Mib >>>>>>>> used_size : 6.63733 Mib >>>>>>>> available_size : 80 B >>>>>>>> Space 4 >>>>>>>> name : large_object_space >>>>>>>> size : 0 B >>>>>>>> used_size : 0 B >>>>>>>> available_size : 11.1015 Gib >>>>>>>> >>>>>>>> When V8 crashes, it prints a heap summary, which I'm sending >>>>>>>> attached (file heap_after_error.txt). I also save a core dump. >>>>>>>> Sometimes, the system crashes during the creation of an Isolate; >>>>>>>> sometimes, >>>>>>>> during the creation of a Context; typically, it crashes during snapshot >>>>>>>> deserialization. However, the top of the stack is always the same, and >>>>>>>> it's >>>>>>>> reproduced below (also included attached, file stacktrace.txt). >>>>>>>> >>>>>>>> #7 v8::internal::OS::Abort () at >>>>>>>> ../../src/base/platform/platform-posix.cc:230 >>>>>>>> #8 0x00007ff15a2f922f in v8::Utils::ReportOOMFailure >>>>>>>> (location=0x7ff15b20f62e "Committing semi space failed.", >>>>>>>> is_heap_oom=false) at ../../src/api.cc:381 >>>>>>>> #9 0x00007ff15a2f918e in v8::internal::V8::FatalProcessOutOfMemory >>>>>>>> (location=0x7ff15b20f62e "Committing semi space failed.", >>>>>>>> is_heap_oom=false) at ../../src/api.cc:352 >>>>>>>> #10 0x00007ff15aa3fefc in >>>>>>>> v8::internal::Heap::EnsureFromSpaceIsCommitted (this=0x7ff12c0bdde0) at >>>>>>>> ../../src/heap/heap.cc:1234 >>>>>>>> #11 0x00007ff15aa3ed34 in >>>>>>>> v8::internal::Heap::PerformGarbageCollection (this=0x7ff12c0bdde0, >>>>>>>> collector=v8::internal::MARK_COMPACTOR, >>>>>>>> gc_callback_flags=v8::kNoGCCallbackFlags) at >>>>>>>> ../../src/heap/heap.cc:1308 >>>>>>>> #12 0x00007ff15aa3e2ab in v8::internal::Heap::CollectGarbage >>>>>>>> (this=0x7ff12c0bdde0, collector=v8::internal::MARK_COMPACTOR, >>>>>>>> gc_reason=v8::internal::GarbageCollectionReason::kDeserializer, >>>>>>>> collector_reason=0x7ff15b20f07a "GC in old space requested", >>>>>>>> gc_callback_flags=v8::kNoGCCallbackFlags) at >>>>>>>> ../../src/heap/heap.cc:1002 >>>>>>>> #13 0x00007ff15a33cdee in v8::internal::Heap::CollectGarbage >>>>>>>> (this=0x7ff12c0bdde0, space=v8::internal::OLD_SPACE, >>>>>>>> gc_reason=v8::internal::GarbageCollectionReason::kDeserializer, >>>>>>>> callbackFlags=v8::kNoGCCallbackFlags) at ../../src/heap/heap-inl.h:681 >>>>>>>> #14 0x00007ff15aa3d069 in v8::internal::Heap::CollectAllGarbage >>>>>>>> (this=0x7ff12c0bdde0, flags=2, >>>>>>>> gc_reason=v8::internal::GarbageCollectionReason::kDeserializer, >>>>>>>> gc_callback_flags=v8::kNoGCCallbackFlags) at ../../src/heap/heap.cc:848 >>>>>>>> #15 0x00007ff15aa3fe84 in v8::internal::Heap::ReserveSpace >>>>>>>> (this=0x7ff12c0bdde0, reservations=0x7ff148fe6078, >>>>>>>> maps=0x7ff148fe60f8) at >>>>>>>> ../../src/heap/heap.cc:1215 >>>>>>>> >>>>>>>> In the heap summary that gets printed, I have noted some apparent >>>>>>>> discrepancies with the typical data I get from the API (shown above): >>>>>>>> for >>>>>>>> example, the summary says the size of the old space is 4067328 bytes (= >>>>>>>> 3.88 Mib), not the typical 39.56 Mib I get from the API. >>>>>>>> >>>>>>>> I have dived into V8 garbage collection, but still couldn't make >>>>>>>> sense of the error message ("Committing semi space failed"). So, I'd >>>>>>>> like >>>>>>>> to know under which circumstances this error can happen, and how it's >>>>>>>> possible that it only happens occasionally, given that each test >>>>>>>> iteration >>>>>>>> is identical to the others and there is no detectable memory leaks. >>>>>>>> >>>>>>>> If you need more information, please tell me, and I'll be glad to >>>>>>>> provide it. >>>>>>>> >>>>>>>> Thank you very much in advance. >>>>>>>> Andre >>>>>>>> >>>>>>>> -- >>>>>>>> -- >>>>>>>> v8-users mailing list >>>>>>>> v8-u...@googlegroups.com >>>>>>>> http://groups.google.com/group/v8-users >>>>>>>> --- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "v8-users" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to v8-users+u...@googlegroups.com. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> -- >>>>>>> -- >>>>>>> v8-users mailing list >>>>>>> v8-u...@googlegroups.com >>>>>>> http://groups.google.com/group/v8-users >>>>>>> --- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "v8-users" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to v8-users+u...@googlegroups.com. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> -- >>>> -- >>>> v8-users mailing list >>>> v8-u...@googlegroups.com >>>> http://groups.google.com/group/v8-users >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to v8-users+u...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >>> -- >>> v8-users mailing list >>> v8-u...@googlegroups.com >>> http://groups.google.com/group/v8-users >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "v8-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to v8-users+u...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to v8-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.