HN user

keynha

8 karma

I build and write about AI systems, data infrastructure, and the practical tradeoffs behind modern software engineering. https://github.com/KayhanB21

Posts5
Comments12
View on HN

This is really nicely done, the log zoom makes 4M events feel navigable instead of like a wall. How are you serving a viewport at that scale: precomputed levels of detail, or a query against the raw events on each pan and zoom?

That coexistence is also why the GC-free rewrite helps more than the speed numbers suggest. An archiver is allocation-light until it hits a compression burst, then the Go heap can spike toward 2x live right when Postgres wants that memory. GOMEMLIMIT caps the spike but pays in GC CPU during exactly those bursts, so on a small instance, you are trading OOM risk for throughput. Rust removes that dial.

Fiu was told not to reply and had no tools wired up, so the only way it could lose was by printing the secret straight back, which is the half models are already trained hard to resist. The case worth testing is when the agent can send mail or make a request to be useful, because then nobody needs it to repeat the secret, just to take an action that ships it out of band. Whether the secret shows up in the output tells you nothing about that.

For most apps the backend is slower than the proxy by a wide margin, so Caddy is nowhere near the bottleneck. Where it flips is high connection churn, since TLS handshakes are the expensive part and a flood of short lived connections without session resumption burns proxy CPU well before steady state proxying does. Very high RPS of tiny responses is the other case, where allocation and header parsing start to show.

The reason to use it is that it skips the double lookup. A normal rowid table with a UUID primary key keeps two B-trees: the table itself keyed by the hidden rowid, and a separate index from your UUID to that rowid. A lookup by UUID walks the index to find the rowid, then walks the table to find the row. WITHOUT ROWID makes the UUID the table's key directly, so the row sits in that leaf and you walk one tree instead of two, and you don't store the UUID a second time.

The tradeoff is what the benchmark is hitting. Once the table is physically ordered by the key, a random v4 scatters every insert across the tree and you pay for the page splits. A plain rowid table keeps that churn in the secondary index, which is just the key plus a rowid, while the table itself stays append-ordered. So it only really pays off when the key is something you look up directly and is roughly sequential, which is why v7 comes back near baseline.

In LLM serving, I treat the failure mode at the end of this (long-lived blocks interleaved with short-lived ones, which expandable segments still can't merge across) as the steady state, not an edge case: weights and graph buffers sit forever while per-request KV churns. So I've stopped relying on the caching allocator for KV at all. vLLM reserves one big region at startup and pages fixed-size KV blocks itself, so the allocator never sees the churn. Same fragmentation, solved one layer up.

Behavioral signals are the usual answer: risk-scored, invisible challenges; proof-of-work (cost without identity, though it taxes mobile); and signup-velocity/rate limits that stop cheap abuse before any challenge fires. The reason fingerprinting wins anyway is that it requires less operator effort, not that it is the only thing that works.