[HN Gopher] WebVM: Server-less x86 virtual machines in the browser ___________________________________________________________________ WebVM: Server-less x86 virtual machines in the browser Author : AshleysBrain Score : 127 points Date : 2022-02-01 19:01 UTC (3 hours ago) (HTM) web link (leaningtech.com) (TXT) w3m dump (leaningtech.com) | bkyan wrote: | How do you move files into or out of this VM? | williamstein wrote: | The JIT compilation to WebAssembly they are doing with WebVM is | pretty cool! | | I didn't see any benchmarks on the linked to page. I tried their | sample Fibonacci program, but up to 100000 and ONLY timing actual | execution (using the time Python module) to not include startup | time, and WebVM only took 6.7 times as long as native for me. | That's very impressive. | | There's a similar open source project called | https://copy.sh/v86/. Using their arch Linux image with the exact | same Fibonacci benchmark, it take 44 times as long as native. | syrusakbary wrote: | Thanks for the benchmarks! I was curious about timing. | | Python is also a bit tricky because it does things with | pointers that I believe are hard to optimize (or maybe not, who | knows!). Have you tried other languages/programs? | benou wrote: | I timed a very simple loop in C: "for (volatile int i=0; i<N; | i++);" (handful of arithmetic, compare and branch instructions) | with N=1e9 and it was 70% the speed of native which looks | really good. I'd love to see LINPACK now :) | syrusakbary wrote: | Thinking more about this. | | I'd love to try v8 there, so we can benchmark the WebVM v8 | against the Native JS in the browser... all using the same | engine (is a bit meta, isn't it?) | apignotti wrote: | Well, nodejs uses V8 and it's installed | syrusakbary wrote: | Exciting... trying it as I type! | | Edit: I'm trying to run the following benchmarks [1]: | function mySlowFunction(baseNumber) { | console.time('mySlowFunction'); let result = 0; | for (var i = Math.pow(baseNumber, 7); i >= 0; i--) { | result += Math.atan(i) * Math.tan(i); }; | console.timeEnd('mySlowFunction'); } | mySlowFunction(8); // higher number => more iterations => | slower | | Results: 99ms in my Chromium browser (v8 JIT enabled), it | breaks in the WebVM (after typing `node` and enter) with | `TODO: FAULT af5147bf / CODE da d9 83` | | [1]: https://gist.github.com/sqren/5083d73f184acae0c5b7 | apignotti wrote: | That's an unimplemented instruction. If I have to make a | guess, one the trigonometric funcs you are calling. Feel | free to report a bug if you'd like. | Recursing wrote: | As a smoke test, I tried running `time python3 -c | 'print(max(range(2*10**7)))'` | | It's about ~10x faster on webvm.io compared to copy.sh/v86 and | only ~20x slower than native, impressive stuff | endisneigh wrote: | What needs to happen to enable the browser to act as a | functioning web server? | apignotti wrote: | It depends on the definition of "functioning". | | If you'd like to access a server from another tab / iframe of | the same browser, that's almost possible already, just some UX | work would be required. | | If you'd like users of the same page (or a separate specialized | page) to connect, that could be possible with WebRTC. | | If you'd like arbitrary hosts to connect, that would require a | server side proxy, there is no client-side only solution that I | can see, | mrtesthah wrote: | Use Opera? | | https://www.ctrl.blog/entry/opera-unite.html | dnautics wrote: | we are well on the way towards the death of yavascript, let's | hope there the exclusion zone doesn't come true. | didip wrote: | I always wonder if someone will eventually put Docker container | up on the browser. It will make tons of experimentation work | easy. | mrtesthah wrote: | is this some kind of joke to make computing as slow as | possible? | emteycz wrote: | Some people don't care that it's slow. Availability and | uniformity is much more valuable for example in school | environment, especially at one where they teach IT one hour | per week and the teacher is not really a programmer | themselves. | maltenuhn wrote: | Nice! How does this compare to Web Containers | (https://blog.stackblitz.com/posts/introducing-webcontainers/, | proprietary to Stackblitz)? | remisharrock wrote: | From what I read on their website, web containers cannot run | Linux binaries or compile c code or run python scripts / bash | etc. - for example? | mahoro wrote: | Wow, this is amazing! | | Now we could create a /dev/dom virtual device, and write dynamic | web pages in pure bash. I love this. | colejohnson66 wrote: | Or a DOMFS in /dom that's organized in the same hierarchy as | the browser DOM. For example, to write a whole page: | echo "...." > /dom | | Update the <title> tag: echo "TITLE" > | /dom/html/head/title | | Change the charset: echo "EBCDIC" > | /dom/html/head/meta[1].charset // second <meta> tag | echo "EBCDIC" > /dom/html/head/1.charset // second child | of <head> | | Even go full XPath. Replace a tag's inner HTML: | echo "<div>abc</div>" > /dom/[@id='myID'] | | This is a horrible idea... | eurasiantiger wrote: | Oracle Acquisitions team would like to discuss a business | transaction. | [deleted] | westurner wrote: | Is WebVM a potential solution to "JupyterLite doesn't have a | bash/zsh shell"? The current pyodide CPython Jupyter kernel takes | like ~25s to start at present, and can load Python packages | precompiled to WASM _or_ unmodified Python packages with | _micropip_ : https://pyodide.org/en/latest/usage/loading- | packages.html#lo... | | Does WebVM solve for workload transparency, CPU overutilization | by one tab, or end-to-end code signing maybe with W3C ld-proofs | and whichever future-proof signature algorithm with a URL? | miohtama wrote: | The VM cannot have full TCP/IP stack, so any data research | tasks are likely to need a special code paths and support for | downloads. No SQL databases, etc. | westurner wrote: | From "Hosting SQLite Databases on GitHub Pages" | https://news.ycombinator.com/item?id=28021766 | https://westurner.github.io/hnlog/#comment-28021766 : | | DuckDB can query [and page] Parquet from GitHub, sql.js- | httpvfs, sqltorrent, File System Access API (Chrome only so | far; IDK about resource quotas and multi-GB datasets), | serverless search with WASM workers | | https://github.com/phiresky/sql.js-httpvfs : | | > _sql.js is a light wrapper around SQLite compiled with | EMScripten for use in the browser (client-side)._ | | > _This [sql.js-httpvfs] repo is a fork of and wrapper around | sql.js to provide a read-only HTTP-Range-request based | virtual file system for SQLite. It allows hosting an SQLite | database on a static file hoster and querying that database | from the browser without fully downloading it._ | | > _The virtual file system is an emscripten filesystem with | some "smart" logic to accelerate fetching with virtual read | heads that speed up when sequential data is fetched. It could | also be useful to other applications, the code is in | lazyFile.ts. It might also be useful to implement this lazy | fetching as an SQLite VFS [*] since then SQLite could be | compiled with e.g. WASI SDK without relying on all the | emscripten OS emulation._ | westurner wrote: | Also, I'm not sure if jupyterlab/jupyterlab-google-drive | works in JupyterLite yet? Is it yet possible to save | notebooks and other files from JupyterLite running in WASM | in the browser to one or more cloud storage providers? | | https://github.com/jupyterlab/jupyterlab-google- | drive/issues... | | https://github.com/jupyterlite/jupyterlite/issues/464 | Klasiaster wrote: | The VM could have its own TCP/IP stack, possibly with a SLIRP | layer for translation of connections to the outside. Internet | connectivity can be done by limiting it to AJAX, or | forwarding the packets to a proxy (something like | http://artemyankov.com/tcp-client-for-browsers/), or | including a Tor client that connects to a Tor bridge, etc. | westurner wrote: | Is all of that necessary to LD_PRELOAD sockets and tunnel | them over WebSockets, WebRTC, etc? | | So e.g. curl doesn't work without (File System Access API,) | local storage && translation of e.g. at least _normal curl_ | syscalls to just HTTP /3? | xiphias2 wrote: | This looks awesome. | | Would it be possible to compile GNU/Linux to WASM as a target | platform? What's missing for that? | apignotti wrote: | Hello HN, author of the post here, happy to answer questions. | easrng wrote: | Is there support for loopback networking (for IPC)? Is there a | way to translate HTTP(S) requests to `fetch` requests? How | difficult would it be to port a Go app that uses | https://github.com/pion/webrtc to use the browser's native | WebRTC? | apignotti wrote: | HTTP request could be intercepted, but due to CORS they would | most likely not succeed. I have not studied the WebRTC | protocol in detail but it might be possible. | brian_herman wrote: | How does this compare to https://bellard.org/jslinux/tech.html? | https://bellard.org/jslinux/ | apignotti wrote: | Perf. Our JIT is extremely advanced. Of course different | workloads will behave differently, but you are welcome to try | multiple payloads and see for yourselves. | easrng wrote: | And also https://copy.sh/v86 | remisharrock wrote: | And jor1k (JavaScript openrisc processor emulator) : well, | they emulate processors (x86, openrisc..) in JavaScript | while WebVM execute (transpiled?) code in webassembly | xmly wrote: | How about the network stack? Is the VM can talk with other VMs | from other browsers. | apignotti wrote: | Not in the current implementation, but absolutely possible | with WebRTC. We have done something equivalent some time ago: | https://medium.com/p/29fbbc62c5ca | habitue wrote: | Can you run containers in webvm? | thekozmo wrote: | Impressive stuff! Worth to try to run the OSv unikernel (one of | my babies) in it. | Klasiaster wrote: | So, this is a reimplementation of the Linux ABI and no Linux | kernel source is involved, right? | apignotti wrote: | That's correct. | Klasiaster wrote: | Have you tried compiling Linux as User Mode Linux with | emscripten? I imagine something like this | https://github.com/nabla-containers/nabla-linux would run | on wasm, too? | apignotti wrote: | Well, User Mode Linux would still require an underlying | Linux ABI, for example mmap to implement pagination. With | sufficient work it might be possible to actually run UM | Linux _on top_ of CheerpX / WebVM. | | Implementing the Linux ABI ourselves gives us the | opportunity of a tighter integration with the Web | platform anyway. | [deleted] | remisharrock wrote: | Will you open source your code one day and if no, why not? | arturventura wrote: | Hey dude, I've been screwing around implementing plan9 | semantics in a OS like system for the browser | (https://github.com/intigos/possimpible). I'm interested in | using a x86 emulator inside a webwoker that I'm using for | processes so I can run x86 code. How hard is something like | this? Can you give me some pointers on how to start working on | this? Thanks! | btdmaster wrote: | It seems to not work with my eager block settings. It works | with a fresh Firefox profile though, so it's not clear what the | issue exactly is though. I know for sure that the ext2 is never | actually downloaded (0 byte response) and when I try to check | anything in DevTools cxcore.wasm triggers a pause on debugger | statement, which spikes the CPU. | | Any chance there could be a version with all the assets in one | thing (say, GitHub Pages)? | syrusakbary wrote: | This is awesome. Really. Props to all the Leaning Tech team | (creators of Cheerp, an alternative to Emscripten)! | | I believe it will be possible to achieve similar state in the | future just using Native Wasm/WASI (so no transpilation from x86 | -> Wasm will be needed), but we are far from it given how slow | the WASI standards move. | | The shell is impressive: https://webvm.io/ (only downloads ~5Mb | of resources for a full Debian distro) | apignotti wrote: | Thanks, appreciated. | | By the way, it's spelled "Cheerp", with a lowercase p :-) | syrusakbary wrote: | Corrected! | s5806533 wrote: | Truly an impressive feat, and a lot of work no doubt. But why? | Recently it seems to be some kind of fad to demonstrate that | everything can be done inside a web browser. Again: why? Scope | creep of web browsers is already beyond repair. | remisharrock wrote: | For educational uses, I have plenty of use cases for large | scale teaching and learning, without backend servers and | without installing anything complex on the client side. ___________________________________________________________________ (page generated 2022-02-01 23:00 UTC)