In addition to the excellent technical points that Leszek explained, I just
wanted to clarify additionally that we don't have a concept of "major
releases 8 -> 9" etc. V8's version numbers are assigned by adding 0.1 every
six weeks, rolling from x.9 to (x+1).0. There are *zero* technical or
strategic considerations going into version numbers, it's entirely
mechanical and on a time-based schedule. The 8.9 -> 9.0 bump is exactly as
significant as 8.8 -> 8.9 or 9.0 -> 9.1. (It's similar to the Linux kernel
going from, say, 4.19 to 5.0.)

Using daily V8 snapshots in production is an interesting choice. If that
works for you, great; I wouldn't recommend it, given that daily snapshots
are quite severely broken every now and then. See
https://v8.dev/docs/version-numbers for our official recommendation
(simplified TL;DR: use what Chrome Stable uses).


On Tue, Jul 20, 2021 at 12:19 PM Leszek Swirski <lesz...@chromium.org>
wrote:

> Hi Vitali,
>
> Stabilising the cached data format as-is is pretty challenging; the cache
> as written is pretty much a direct field-by-field serialisation of the
> internal data structures, so freezing the cache would mean freezing the
> shapes of those internal objects, effectively making the internal fields an
> API-level guarantee. Furthermore, it's a backdoor to a stable bytecode
> format, which is something we've also pushed back on as it severely limits
> our ability to work on the interpreter; if we wanted to have a slightly
> weaker constraint of at least guaranteeing backwards compatibility with old
> bytecode, we'd have to vastly expand our test suite with old bytecodes in
> order to try to maintain this backwards compatibility, and even then I'm
> not sure we could fully guarantee if there's some edge case not covered in
> the test suite. Same story with porting code caches from older to newer
> versions; such a port would require a mapping from old to new, which would
> require a) some sort of log of what old fields/bytecodes translate to what
> new ones, and b) heavy testing to make sure that this mapping is valid.
> This is a big security problem; the deserialisation is pretty dumb (for
> performance reasons), and just spits out data onto the V8 heap without e.g.
> checking if the number of fields match. Having bugs in the old->new
> mapping, or in the backwards compatibility, would open up a whole pandora's
> box of security issues, where one deleted field in an edge case that tests
> don't cover would become an out-of-bounds write widget.
>
> Given that this would greatly increase our development complexity
> (maintaining a stable API is already a lot of trouble for us), would be a
> big source of security issues, and I don't expect it to provide much
> benefit for Chrome (since we expect websites to change more often than
> Chrome versions), I don't see us either working on (or accepting patches
> for) a stable or even upgradeable cache.
>
> I'd be curious to know if you've actually observed/measured script parse
> time being a big problem, or whether you're more seeing issues due to lazy
> function compilation time. We've done a lot of work on parse time in recent
> years, so it's not as slow as (some) people assume. We're also prototyping
> a potential stable & standardisable snapshot format for the results of
> partial script execution, which could help you if you're seeing large
> script "setup" code being an issue, but it wouldn't store compiled bytecode
> (for the above reasons).
>
> I appreciate that this might be a disappointing answer for you, but having
> flexibility with internal objects and bytecode is one of the things that
> allows us to stay performant and secure.
>
> - Leszek
>
> On Monday, July 19, 2021 at 9:00:52 PM UTC+2 lewis....@gmail.com wrote:
>
>> Hi Vitali,
>>
>> I’m neither from the v8 team, nor an expert in this subject matter. Just
>> wanted to drop an interesting project: Hermes - https://hermesengine.dev
>> , a javascript engine by Facebook that is tailored for fast startup times.
>> It does this by precompiling javascript into bytecode at build time.
>>
>> So something like this should be possible maybe.
>>
>> Best,
>> Joe
>>
>> On Mon, Jul 19, 2021 at 9:32 PM Vitali Lovich <vlo...@gmail.com> wrote:
>>
>>> Hi,
>>>
>>> I wanted to kick off a discussion and solicit some thoughts on whether
>>> it would be operationally feasible to try to stabilize the cached data
>>> format of the compiler.
>>>
>>> The context is that I work on Cloudflare Workers. We'd like to increase
>>> the script size we allow our customers to upload, but we have concerns
>>> about the performance impact that will have (specifically script parse
>>> time). One mitigation for this would be to leverage the script compiler's
>>> cached data & generate the cache whenever the user uploads a script. This
>>> way we can precompute the cached data on upload & deliver it alongside the
>>> script.
>>>
>>> Unfortunately, this approach has a major stumbling block which is that
>>> we track V8 releases as they're published. That means our V8 version
>>> changes roughly every week which would (at best) necessitate us
>>> regenerating the cache for all the scripts on a weekly basis. This adds
>>> scalability & implementation complexity concerns (especially since we may
>>> have multiple versions of V8 running at one time).
>>>
>>> I'm not looking to discuss implementation specific details, but more
>>> trying to get an overview of the opinions from the talented V8 team.
>>>
>>>    - I haven't actually examined yet what the structure of the code
>>>    cache actually looks like. Are there prohibitive technical blockers that
>>>    can't really be resolved that make this a non-starter?
>>>    - Are there meaningful maintenance/security/implementation concerns?
>>>    I'm assuming there are very good reasons why the data is version locked.
>>>    - It's not necessarily a requirement to freeze it for all time
>>>    (although that would of course be ideal). What is the cadence for this
>>>    format actually changing (vs no-op version bumps for safety)? Would it be
>>>    possible to stabilize within a major V8 release (8->9, 9->10, etc) or 
>>> for 6
>>>    month periods?
>>>    - If stabilizing is truly impossible (as I suspect it probably is),
>>>    would it be technically feasible to implement a cheaper "upgrade" that
>>>    converts the previous code cache to the current one? It's not ideal, but 
>>> it
>>>    could significantly reduce the costs needed to upgrade many scripts at 
>>> once
>>>
>>> I suspect that any improvement here would also apply to Chrome in the
>>> form of a more consistent performance experience after an upgrade.
>>>
>>> We do have a fallback plan that's workable within the current
>>> architecture, but it's got some downsides that would be neat to bypass by
>>> stabilizing the format. Appreciate any feedback/insights anyone can offer.
>>>
>>> Thanks,
>>> Vitali
>>>
>>> --
>>
>>

-- 
-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-users/CAKSzg3Qk%3D4y66misYkQjDnVZvzDiN2ZPKNd5XeHXeNYVELcOCQ%40mail.gmail.com.

Reply via email to