Thanks for the clarification.

Prakash

On Friday, June 8, 2018 at 11:32:24 PM UTC+5:30, Kenton Varda wrote:
>
> No clean solution, but with hacks we've been able to solve the problem for 
> our use case.
>
> I set the heap limit to 8x the limit I actually want. Then, after each 
> call into the isolate, I check if the memory usage has gone over the 
> intended limit. If so, I invoke garbage collection. If it's *still* over 
> the limit after that, then I terminate the isolate at that point.
>
> Meanwhile, we also enforce a CPU time limit of 50ms. In practice, a script 
> that allocates tons of memory tends to run out of CPU time before it can 
> hit the 8x heap limit (especially as the GC slows things down when 
> approaching the limit).
>
> This together seems to solve the case of scripts that accidentally 
> allocate too much memory.
>
> A carefully-crafted malicious script can still cause an abort. In that 
> case, the SIGABRT single handler blacklists the offending script and simply 
> leaves the thread in limbo rather than exit the process. Some time later, 
> if we need that RAM back, we can do a clean restart, in which we start a 
> new process to handle new requests while letting the old process finish up 
> anything in-flight and then exit.
>
> One thing I haven't had time to experiment with yet is whether we can 
> longjmp() out of the signal handler and then delete the isolate, rather 
> than leave it in limbo. Obviously this would be super-leaky, but perhaps we 
> could reclaim most of the resources associated with the isolate. (In my 
> first message in this thread I was contemplating whether I could compile 
> with exceptions enabled in order to be able to do a proper stack unwind 
> invoking destructors, which could perhaps make things a little bit less 
> leaky, even though V8 is not exception-safe. But that won't actually work 
> because libunwind can't unwind through JIT'd code.)
>
> -Kenton
>
> On Fri, Jun 8, 2018 at 3:06 AM, Prakash Bailkeri <prakash....@gmail.com 
> <javascript:>> wrote:
>
>> Hello Kenton,
>>
>> Did you find a reliable way to resolve "isolate heap" OOM issue? I had 
>> similar question and proposing to use AddNearHeapLimitCallback?
>> *https://groups.google.com/forum/?nomobile=true#!topic/v8-users/qLs7-XT2Zvg 
>> <https://groups.google.com/forum/?nomobile=true#!topic/v8-users/qLs7-XT2Zvg>*
>>
>> I am trying to solve a issue where hacker/"accidental code"/"bug" asks 
>> for memory more than the heap memory limit on isolate 
>> (set_max_old_space_size)
>>
>> Any feedback from you?
>>
>> Thanks, Prakash 
>>
>> On Tuesday, October 31, 2017 at 4:10:09 AM UTC+5:30, 
>> ken...@cloudflare.com wrote:
>>>
>>> Hi all,
>>>
>>> Sorry, I think my first message was confusing.
>>>
>>> To be clear, in my case, my C++ process is nowhere near being out of 
>>> memory. But, I'm configuring the V8 isolates I create with a low heap size, 
>>> using v8::ResourceConstraints::set_max_old_space_size(). It's the V8 heap 
>>> that is running out of memory.
>>>
>>> I'm well aware that writing C++ code that can recover from malloc() 
>>> failure is basically impossible.
>>>
>>> But in my case, V8 is hitting a self-imposed limit on specifically the 
>>> V8 heap. It seems like we should be able to find a hack to work around this.
>>>
>>> For example, I could live with a solution like: When V8's heap is 
>>> exhausted, it calls the OOM callback. If that returns without terminating, 
>>> then V8 doubles its own heap limit and continues.
>>>
>>> In this case, I would have my OOM callback call TerminateExecution() and 
>>> arrange for the isolate to be discarded as soon as control returns back out 
>>> of V8. It's fine if extra memory is allocated in the meantime as a stopgap 
>>> to avoid aborting.
>>>
>>> Is there a way to accomplish something like this? If not, how hard would 
>>> it be to add?
>>>
>>> >> For example, what if I compile with C++ exceptions enabled, and have 
>>> my OOM 
>>> >> handler throw an exception, hence unwinding the stack back to where I 
>>> >> entered V8. Then, I promptly destroy the isolate. Would that work? 
>>> >
>>> > No.  It would end very badly.  V8 is not exception-safe. 
>>>
>>> To be clear about this suggestion: Obviously it's not going to be clean, 
>>> but I was hoping to discuss what kind of bad things would actually be 
>>> likely to happen. The isolate would be left in an inconsistent state, but 
>>> if I'm deleting it anyway, how much does that matter? Small memory leaks 
>>> would not be a big deal here, since I can periodically drain the process 
>>> and start a new one to "fix" them.
>>>
>>> -Kenton
>>>
>>> On Wednesday, October 25, 2017 at 12:13:22 AM UTC-7, Andreas Rossberg 
>>> wrote:
>>>>
>>>> To supplement Ben's answer: the reason why this was never a design goal 
>>>> is that it is practically impossible to achieve. It is extremely 
>>>> difficult to recover reliably from OOM in certain situations. AFAIK, no 
>>>> engine out there is able to guarantee that.
>>>>
>>>> On 24 October 2017 at 22:44, Ben Noordhuis <in...@bnoordhuis.nl> wrote:
>>>>
>>>>> On Tue, Oct 24, 2017 at 10:17 PM, 'Kenton Varda' via v8-users
>>>>> <v8-u...@googlegroups.com> wrote:
>>>>> > Hi v8-users,
>>>>> >
>>>>> > It appears that in some cases V8 will abort the process when it runs 
>>>>> out of
>>>>> > heap space rather than throw a JS exception. The behavior can be 
>>>>> overridden
>>>>> > by registering an OOM callback, but if that callback returns without
>>>>> > aborting, it seems V8 promptly crashes.
>>>>> >
>>>>> > It seems like some code paths are designed to handle OOM gracefully, 
>>>>> but
>>>>> > others aren't.
>>>>> >
>>>>> > For my use case, it's pretty important that a malicious script 
>>>>> cannot cause
>>>>> > the process to abort, since our processes are multi-tenant. Ideally 
>>>>> OOM
>>>>> > would throw an exception, but terminating the isolate is also 
>>>>> acceptable, as
>>>>> > long as other isolates can keep going.
>>>>> >
>>>>> > Is there any way to accomplish this?
>>>>>
>>>>> No. Graceful handling of OOM conditions is not one of V8's design 
>>>>> goals.
>>>>>
>>>>> > For example, what if I compile with C++ exceptions enabled, and have 
>>>>> my OOM
>>>>> > handler throw an exception, hence unwinding the stack back to where I
>>>>> > entered V8. Then, I promptly destroy the isolate. Would that work?
>>>>>
>>>>> No.  It would end very badly.  V8 is not exception-safe.
>>>>>
>>>>> > Or, is there some trick to making V8 less crashy on OOM, aside from 
>>>>> going
>>>>> > through and fixing all the code paths that crash (which probably 
>>>>> isn't
>>>>> > feasible for me)?
>>>>>
>>>>> No tricks, no.  The best you can do is monitor memory usage and call
>>>>> `Isolate::TerminateExecution()` when it gets too high but that won't
>>>>> be 100% reliable; OOM conditions in C++ code will still be fatal.
>>>>>
>>>>> Probably not the answers you were hoping for but there it is.
>>>>>
>>>>> --
>>>>> --
>>>>> 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 <javascript:>
>> http://groups.google.com/group/v8-users
>> --- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "v8-users" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/v8-users/vKn1hVs8KNQ/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> v8-users+u...@googlegroups.com <javascript:>.
>> 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.

Reply via email to