Remix.run Logo
tptacek 5 hours ago

"Idle cost is that one lightweight SELECT per millisecond per database — no page-cache pressure, no writer-lock contention, no kernel file watcher in the mix."

I think (respectfully) the LLM that probably wrote this overshot the mark here because busy-polling a select does not actually sound better to me than a "kernel file watcher".

russellthehippo 10 minutes ago | parent | next [-]

Respectfully (thanks haha) - yeah probably right. Original intent was to use inotify type thing but i avoided per-platform differences at the outset. this was definitely a for fun project that blew up unintentionally and am working to harden/improve.

Love Fly.

felooboolooomba 4 hours ago | parent | prev | next [-]

"one lightweight SELECT per millisecond"

This reminds me of the teenager who told her dad that she was just a tiny little bit pregnant.

sroussey 43 minutes ago | parent | next [-]

Thing of the battery!

(read that in the way of "think of the children!")

giraffe_lady 4 hours ago | parent | prev [-]

[flagged]

rv64imafdc 3 hours ago | parent | next [-]

Hold on -- if it really is "one lightweight SELECT per millisecond", and you're saying a select is "a couple hundred microseconds", say generously 200us?, then you're spending 200us out of every 1000us just selecting. That's a lot of polling!

giraffe_lady 3 hours ago | parent [-]

I mean only in the same sense that you spend 1 second per second doing something. Time is probably not the best way to evaluate the resources this consumes and I doubt it takes much of anything else either.

It does seem weird though even for sqlite. I wonder how oban does it. I also wonder if OP knows oban can run on sqlite.

tptacek 4 hours ago | parent | prev [-]

Yeah, again, to be clear: I get how SQLite works and I'm not dunking on the design, I'm just saying the comparison set up on this page snags. It's a classic LLM negated triptych, but "one of these things is not like the other": cache pressure: bad, writer contention: bad, kernel file watcher: ... good, actually? Intuitively seems better than this design?

8note an hour ago | parent | prev | next [-]

to me it sounds like they asked it to not make a kernel file watcher, and now it writes that into every comment everywhere, despite not even being in the implementation

russellthehippo 10 minutes ago | parent [-]

Yup

ncruces 4 hours ago | parent | prev | next [-]

If you're not making any changes to the database, does the SELECT "kill" you?

And if you are making changes, don't you have to poll regardless after the file watcher wakes you?

For WAL mode, SQLite can probably satisfy this query just by inspecting some shared memory. But it is busy waiting, sure.

billywhizz an hour ago | parent | next [-]

SQLite has a wal hook which calls you back every time a transaction is committed to the WAL. https://www.sqlite.org/c3ref/wal_hook.html

ncruces an hour ago | parent [-]

That only catches changes made by the database connection being "hooked."

This has a thread running in the background trying to catch changes made by other connections, potentially (I'm not sure here, but I suspect as much) in different processes that are modifying the same database.

billywhizz an hour ago | parent [-]

good point. but ime and as seems to be widely understood writing from multiple connections is a bit of a minefield in SQLite. and afaik it still would be possible to have a hook on all connections you expect to be writing?

redsocksfan45 2 hours ago | parent | prev [-]

[dead]

d1l 4 hours ago | parent | prev | next [-]

Yeah, I had the same instinct - this feels very much like a "nice idea" but the execution falls short. I mean - busily banging on sqlite like this? Shit at that point just use Redis.

koito17 4 hours ago | parent | next [-]

For what it's worth, Kine (software that k3s uses to replace etcd with SQL databases) implements etcd watches on SQLite through polling[1]. The reason being that SQLite does not offer NOTIFY/LISTEN like MySQL and Postgres do. Ironically, Honkey attempts implementing NOTIFY/LISTEN through polling.

k3s has been running on my home server for about three years now (using the default SQLite backend), and there doesn't seem to be excessive CPU usage despite dozens of watches existing in the simulated etcd. Of course, this doesn't say much about Honker, but it's nonetheless worth pointing out that sometimes the choice of database forces one towards a certain design.

[1] https://github.com/k3s-io/kine/blob/648a2daa/pkg/logstructur...

jallmann 3 hours ago | parent | next [-]

With SQLite, you're basically funneled towards a single-writer / single-process design anyway ... in which case why not use a more traditional condvar + mutex rather than polling?

sroussey 42 minutes ago | parent | prev [-]

Are you trying to avoid sleep?

tptacek 4 hours ago | parent | prev | next [-]

I'm not even saying it's unworkable, just, my intuition is not that the "lightweight per-millisecond select" is an optimal design.

giraffe_lady 4 hours ago | parent [-]

Really might be in sqlite. I've learned to never trust my intuition about performance with that thing. So many times I've gone to "optimize" something and discovered that the naive hack way I had been doing it was faster anyway. It's built for this sort of bullshit.

tptacek 4 hours ago | parent [-]

Maybe, I'm really writing about the language on this page, not about the design (I responded about this upthread).

giraffe_lady 4 hours ago | parent [-]

Oh, yes, I see what you mean now.

andai 4 hours ago | parent | prev [-]

What's the CPU usage? Like 2%?

I had a manual fs polling thing a while back. It was ugly (low time budget, didn't wanna mess with the native watchers), just scanned the whole thing once per second. It averaged out to like 0.3% CPU.

Not elegant, but acceptable for my purposes! (Small-ish directory, and "ping me within a second or two" was realtime enough for this use case.)

booi an hour ago | parent [-]

i mean, technically this is once per millisecond, so this would happen 1000x more. In your case due to the kernel overhead you would likely not even be able to do it (300% CPU?).

Either way this does seem like a very large overhead due to the fact that there's just no other way to do it without a deeper kernel integration which might be outside the scope of what sqlite is trying to do.

nine_k a few seconds ago | parent [-]

If the fs tree scanned once per second had 1000 files, it would be once per millisecond for a file.

paulddraper an hour ago | parent | prev | next [-]

> one lightweight SELECT per millisecond

For the low, low cost of $1 per minute, you can also lease a supercar.

djdillon 4 hours ago | parent | prev [-]

[flagged]