News for hackers. Stuff that matters.

Sirupsen

Re:A distributed queue in a single JSON file on object storage on Tuesday February 24, 2026 @10:27AM (#47138363)
Yep! Other than random reads (~p99=200ms on larger ranges), it's essential to get good download performance of a single file. A single (range) request can "only" drive ~500 MB/s, so you need multiple offsets.

https://github.com/sirupsen/napkin-math

Re:A distributed queue in a single JSON file on object storage on Tuesday February 24, 2026 @07:47AM (#47136429)
Due to the batching, this will only consume a few million class B per month. They are $5/million
Re:A distributed queue in a single JSON file on object storage on Tuesday February 24, 2026 @07:20AM (#47136196)
(cofounder of tpuf here)

We don't have a relational database, otherwise that would work great for a queue! You can imagine us continuing to iterate here to Step 5, Step 6, ... Step N over time. The tradeoff of each step is complexity, and complexity has to be deserved. This is working exceptionally well currently.

Re:Scaling HNSWs on Monday November 17, 2025 @02:59PM (#45957568)
Our query planner has that built in! We've spent a lot of time making high recall with any selectivity in the fitler work.
Re:Amazon S3 Adds Put-If-Match (Compare-and-Swap) on Monday November 25, 2024 @07:37PM (#42241551)
The short of it is that building a database on top of object storage has generally required a complicated, distributed system for consensus/metadata. CAS makes it possible to build these big data systems without any other dependencies. This is a win for simplicity and reliability.
Re:Amazon S3 Adds Put-If-Match (Compare-and-Swap) on Monday November 25, 2024 @07:32PM (#42241528)
To avoid any dependencies other than object storage, we've been making use of this in our database (turbopuffer.com) for consensus and concurrency control since day one. Been waiting for this since the day we launched on Google Cloud Storage ~1 year ago. Our bet that S3 would get it in a reasonable time-frame worked out!

https://turbopuffer.com/blog/turbopuffer

It works great. We’ve had SPANN in production since October of 2023 at https://turbopuffer.com/
Re:The PlanetScale vectors public beta on Tuesday October 29, 2024 @07:34AM (#41982801)
tpuf’s ANN index uses a variant of SPFresh, yup. These are the only two production implementations I am aware of. I don’t think it is in production at MSFT yet
Ya, the world needed S3 to become fully consistent. This didn't happen until end of 2020!
Re:turbopuffer: Fast Search on Object Storage on Wednesday July 10, 2024 @09:36AM (#40926746)
Yeah, thinking about this more I now understand Clickhouse to be more of an operational warehouse similar to Materialize, Pinot, Druid, etc. if I understand correctly? So bunching with BigQuery/Snowflake/Trino/Databricks... wasn't the right category (although operational warehouses certainly can have a ton of overlap)

I left that category out for simplicity (plenty of others that didn't make it into the taxonomy, e.g. queues, nosql, time-series, graph, embedded, ..)

Re:S3 Express Is All You Need on Tuesday November 28, 2023 @03:24PM (#38450774)
Most production storage systems/databases built on top of S3 spend a significant amount of effort building an SSD/memory caching tier to make them performant enough for production (e.g. on top of RocksDB). But it's not easy to keep it in sync with blob...

Even with the cache, the cold query latency lower-bound to S3 is subject to ~50ms roundtrips [0]. To build a performant system, you have to tightly control roundtrips. S3 Express changes that equation dramatically, as S3 Express approaches HDD random read speeds (single-digit ms), so we can build production systems that don't need an SSD cache—just the zero-copy, deserialized in-memory cache.

Many systems will probably continue to have an SSD cache (~100 us random reads), but now MVPs can be built without it, and cold query latency goes down dramatically. That's a big deal

We're currently building a vector database on top of object storage, so this is extremely timely for us... I hope GCS ships this ASAP. [1]

[0]: https://github.com/sirupsen/napkin-math [1]: https://turbopuffer.com/

Re:Choosing vector database: a side-by-side comparison on Wednesday October 04, 2023 @05:03PM (#37771755)
Emil if you email me at [email protected] I can let you into the alpha :)
While I never owned a VanMoof, I read they painted pictures of flat screen TVs on the shipping boxes after months of issues with bikes being damaged by the time they got to customers.
Re:Index Merges vs. Composite Indexes in Postgres and MySQL on Sunday November 27, 2022 @09:39PM (#33769250)
Are you aware of a good write-up on how Clickhouse/other columnar databases do the intersection?
Re:Index Merges vs. Composite Indexes in Postgres and MySQL on Sunday November 27, 2022 @04:55PM (#33767402)
Ideally, I would add three graphs to the post:

(1) Table size on the x-axis, and time on the y-axis for index merge vs composite index

(2) Number of columns on the x-axis, and time on the y-axis for both

(3) Number of final matches on the x-axis, and time on the y-axis for both

But ran out of time and decided to test with the table size of 10M rows, and a 100-ish result set. That's in my experience a decent representation for what you might be doing with a relational database.

Re:Index Merges vs. Composite Indexes in Postgres and MySQL on Sunday November 27, 2022 @04:29PM (#33767186)
You're absolutely right!

I forgot to move this around when I updated the article's structure. This is only relevant when doing the index merge. The article has been updated

Re:Index Merges vs. Composite Indexes in Postgres and MySQL on Sunday November 27, 2022 @03:27PM (#33766549)
Excellent, thank you! I'll add that to the article.
Re:Index Merges vs. Composite Indexes in Postgres and MySQL on Sunday November 27, 2022 @03:20PM (#33766434)
I've added this to the article, thanks!

Composite index (int64, int64): ~70 MiB in Postgres, ~350 MiB in MySQL

Single index (int64): ~70 MiB in Postgres, ~240 MiB in MySQL

If you assume the majority of an index are index entries of (int64, int64, int64) where the third number is some sort of identifier for the record on the heap, you'd expect this to be ~230 MiB. So Postgres does some compression very well here, and MySQL has a bit more overhead for its indexes it seems.

Re:I/O is no longer the bottleneck on Saturday November 26, 2022 @11:49AM (#33754237)
You might be very right about that! It's been a while since I did the SSD benchmarks. Glad to hear it's most likely entirely accurate at 4 GiB/s then!
Re:I/O is no longer the bottleneck on Saturday November 26, 2022 @07:47AM (#33752212)
`madvise(2)` doesn't matter _that_ much in my experience with [1] on modern Linux kernels. SSD just can't read _quite_ as quickly as memory in my testing. Sure, SSD will be able to re-read a lot into ram, analogous to how memory reading will be able to rapidly prefetch into L1.

I get ~30 GiB/s for threaded sequential memory reads, but ~4 GiB/s for SSD. However, I think the SSD number is single-threaded and not even with io_uring—so I need to regenerate those numbers. It's possible it could be 2-4x better.

[1]: https://github.com/sirupsen/napkin-math

Re:I/O is no longer the bottleneck on Saturday November 26, 2022 @07:30AM (#33752119)
Yes, sequential I/O bandwidth is closing the gap to memory. [1] The I/O pattern to watch out for, and the biggest reason why e.g. databases do careful caching to memory, is that _random_ I/O is still dreadfully slow. I/O bandwidth is brilliant, but latency is still disappointing compared to memory. Not to mention, in typical Cloud workloads, IOPS are far more expensive than memory.

[1]: https://github.com/sirupsen/napkin-math

We spent a fair amount of time trying to get this executing fast on SQL. However, with spreadsheets you recursively compute a lot of values. You can do this in SQL with recursive CTEs, but it’s slow, they’re not optimized for this. They also of course won’t do smart caching and dependency management for the cache. Fundamentally, it’s possible, but then we’d need to start hacking on a DB engine to make it work as a sheet. We concluded it’s better to continue on our existing engine.

Older »