How do agents use browsers, and how are thousands of them served over the cloud in a memory-efficient way? I was reading through Browser Use's blog and found their answer. It starts with running a VM inside a VM.
Browser Use runs Firecracker VMs on regular EC2 instances, where AWS has already placed your server inside its own VM. Yeah, that is a lot of virtualization. The normal way to run Firecracker is on a bare-metal server, where you rent the entire physical machine. But running it on regular EC2 is cheaper and easier to set up.
So every browser session becomes a VM inside a VM. The downside is that any request from the inner browser VM now has to pass through two layers to reach the host, not one, and that extra hop costs time.
The place this shows up most is memory.
A browser VM does not start fresh each time; it wakes up from a snapshot that was paused right before Chromium opens. The first time it touches a piece of memory after waking up, the host has to load that memory back in. This is a classic page fault.
With two layers, each page fault has to cross both of them, so it costs more, and a browser waking up touches a lot of memory at once.
Early on, page faults made up 72% of all the pauses the VM had to take to communicate with the host. So the fix they applied was simple: instead of loading memory in small 4 KB chunks, the VM now loads it in 2 MB chunks, 512 times larger (similar to transparent huge pages).
Larger chunks mean fewer page faults, and fewer page faults mean fewer expensive trips across the two layers. This one change brought the wake-up time down from 9.8 seconds to 3.1 seconds.
Classic CS is always super interesting and evergreen. Hope you also found this interesting.
My latest post on control theory and feedback loops has just been published. I’ll start from scratch and gradually build up feedback loops that are self-healing and resilient, capable of scaling thousands of databases.
Check it out: https://t.co/khsqPD8WmT
While writing linux-insides, especially the early boot chapters, I was always annoyed by how non-trivial it is to debug early kernel code.
So I decided to have some fun and build a tiny VM with a built-in debugger: something that can boot a kernel and let me inspect and visualize kernel internals nicely at every stage I would like.
For now I "can" boot the kernel!
Well, ok, it does not boot yet, rather fails beautifully 😀 But I can already see early debug output from linux kernel setup code inside my little vmm
If you like or interested as I in Linux internals, bootloaders, kernels, virtualization, or want to help shape this into executable linux-insides chapters - follow along.
I finally finished the initial version of a new home for my Linux Inside series: https://t.co/IsiURZwi56
In the meantime, I will slowly continue revisiting and updating the old chapters for modern kernels
If you go deeper, you’ll realize Podman isn’t as different from Docker as many people make it sound.
The whole “Docker daemon bad, Podman good” narrative is something yapped by so called tech influencers.
Deep down, this was also a business battle. Docker was becoming the cash cow of containerization. When Docker Enterprise started focusing on enterprise customers(2018-2019). Red Hat took a different route and pushed its own stack and standards.
Fast forward to today, and if you follow the layers down, you’ll still find OCI specs, runc/crun, CRI-O, containerd, systemd, and many of the same building blocks underneath.
Everyone wanted a piece of the containerization cash cow. 😅
This is why fully open catalogs — Polaris, the Iceberg REST reference, DuckLake, Lakekeeper, Gravitino — actually matter.
The format being open is necessary. The catalog being open is what makes it portable.
https://t.co/B0UGJSoVU0
Ok, so LLMs are a Thing.
How do they work? Embeddings.
WTF are embeddings?
I spent a year doing a deep dive. But when I was researching, I couldn't find anything that explained them in business, engineering, AND math contexts. So I wrote a thing.🚀
https://t.co/iykVXIuzty
There is a solution against slow syscalls - to convert your service into a unikernel similar to @nanovms ( https://t.co/FGwYsiFDiC ) or unikraft ( https://t.co/h20RVARGom ). Then syscalls are replaced with regular function calls with the minimum overhead. This allows achieving significant performance boost in busy services - https://t.co/B1z3LQGIoQ .
If you aren't familiar with unikernels, I suggest practicing the following great tutorial - https://t.co/cWCaXJ2WCw
I just can’t get over how neat CXL type 3 is.
Imagine having a 1TB bucket of memory.
But! Instead of 1TB of DDR5, you have a tiered CXL accelerator. To the OS, it *looks* like regular memory, you address it in the same way.
Maybe your accelerator is actually 100GB of DDR5, and ~1TB of high bandwidth flash. The first 100GB is your buffer, and a little controller slowly flushes it out.
Many, many workloads are not hammering RAM enough for you to notice.
Wait! You could get even more clever.
With regular memory, bouncing cachelines between CPU cores is annoying. Often, you’ll program your way around this (avoiding a shared counter) by having each thread maintain a temporary local state with occasional global syncs.
But, if we have a custom CXL 3 memory device, that slow global merge could be implemented in hardware instead. You’d never have to have cores fight over the same cacheline, because the shared-counter would be local to the CXL device!
Aka, a remote atomic!
This is essentially the concept of NDP (near-data processing), and of course there are much, much more fancy algorithms you can do with it, that’s just one example. But you can imagine, especially with database-style operations, how much bandwidth you could save not having to round-trip to the CPU and back for every operation.
Imagine if your RAM could run a regex for you! We’re getting really close to that world.
Before jumping into books like DDIA or Database Internals, it helps to understand the systems layer these designs are built on.
A lot of the design of such data-intensive systems is based on virtual memory: page tables, page faults, mmap, the page cache, swapping, NUMA placement, TLBs, and the tradeoffs between what the OS wants and what the database wants.
My latest article is a ~25,000-word mini-book on virtual memory.
It starts from first principles and goes all the way down to advanced topics like NUMA placement and performance debugging with tools like perf and /proc.
I also wrote it differently: as a dialogue between a user-space process and the kernel.
Most treatments of virtual memory are dry and fact-heavy. I wanted this one to feel more like a story, while still being technically deep.
Link below.
Does anyone recall any other instance in history where a supposedly "revolutionary" technology had to be so aggressively pushed down everyone's throats?
#AI#LLM#Agents
There is an invisible layer that affects many friendships in Bengaluru.
That layer is called urban and civic exhaustion.
Friendships don’t fade because people don’t care. They fade because the city quietly drains the energy required to sustain them.
The traffic takes an hour out of your evening. Work spills into what used to be personal time. Weekends become recovery periods rather than social ones.
You start saying things like:
“Let’s meet soon.”
“Next week for sure.”
“Once things settle down.”
Things rarely settle down.
What earlier required a 10 minute auto ride now requires planning, coordination, and stamina. You have to build stamina to be rejected by drivers on apps, to cross under constructed sites, to take long jumps over open drainages and collect dust on your face.
Friendships slowly move from physical spaces to WhatsApp reactions and Instagram replies.
The affection is still there. The intent is still there.
But the civic friction of the city sits between people.
In cities like Bengaluru, maintaining friendships has quietly become an act of effort. And sometimes, effort is the first casualty of urban and civic exhaustion.
The Claude C Compiler is the first AI-generated compiler that builds complex C code, built by @AnthropicAI. Reactions ranged from dismissal as "AI nonsense" to "SW is over": both takes miss the point.
As a compiler🐉 expert and experienced SW leader, I see a lot to learn: 👇
Last few months have been a lot of learning for me. I have had to fight with someone who has been hosting the Prime Minister for rallies and events! It felt like entire Govt machinery was against me. But how I got support from the system in the process is inspiring! Read (1/n)
Compilers was was known to be the hardest CS class at Cornell which was hard as it is.
We were handed a 8-page PDF at the start of sem for a language spec we'd be implementing by the end of sem, split into 6 parts.
On part 5, the median was a 0/100 and most the class failed.