effective_io_concurrency: The Prefetch Knob PostgreSQL Leaves at 1
The NVMe array could stream 3 GB/s and the range query crept along at 60 MB/s. One GUC explained the gap: effective_io_concurrency was 1, so the kernel heard about pages one at a time.