Calling fsync on each commit makes it slower, doesn't it?

Its an extra syscall. It depends on the use-case if its needed or not

You can enqueue fsync as an op in io_uring, using link flag to sequence it after previous ops and drain flag to ensure no new ops are started until it completes.

You still need to wait for it to complete to report the commit success to the user, the cost of syscall itself is rather minor here.

Avoiding the syscall cost is about maximizing throughput, not minimizing latency. The media's time-to-durability is what it is.

It’s slow because it forces a write to disk. I don’t think the syscall itself matters much.

That's why big DBs do group commits, trading latency for throughput.