Re: [RFC PATCH 0/3] Neural Storage Driver - learning page cache prefetcher
Jan Kara <[email protected]>
| Newsgroups | org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <w7vte4itudtkw2yf4vbmuofiumfffmp2y52dpu2bqvqtdgjvpd@5femyiozss3e> |
On Mon 17-08-26 21:13:55, Ayhan Aydin wrote: > On Mon, Aug 17, 2026 at 06:22:46PM +0200, Jan Kara wrote: > > I can see how SQLite table scans could be improved but I'm really surprised > > by the 64k sequential buffered read. That's basically what the current > > readahead logic is built for. So how is the sync readahead you trigger > > better than what generic async readahead does? > > Hi Honza, > > Thanks for the careful question. This is exactly the workload the > generic readahead was built for, so I was equally surprised at first. > Let me share what we measured and how we explain it. > > We reran the benchmarks with a strict A/B methodology: interleaved > ON/OFF passes on the same machine, drop_caches before every pass, and > the OFF state verified through the module's own counters (no prefetch > activity during OFF passes). > > Seq 64K buffered read (2 GB file, 3 interleaved passes): > > OFF: 396, 400, 396 MB/s (avg 397 MB/s) > ON: 483, 507, 508 MB/s (avg 499 MB/s) -> +25.7% > > To answer how the sync readahead we trigger can beat generic async > readahead, we traced the IO requests actually submitted to the device > (block_rq_issue, filtered to the reader task) in both modes: > > OFF: 16,385 requests, median size 128 KiB (100% in the 64 to 128 KiB band) > ON: 8,195 requests, median size 256 KiB (100% above 128 KiB) > > In the OFF case, the generic readahead keeps issuing fixed 128 KiB > windows (the default read_ahead_kb) for the entire 2 GB run. It never > grows beyond that. When NSD is enabled, it detects the sequential > pattern and expands the readahead window to 256 KiB, then delegates > the actual page insertion to page_cache_sync_readahead(). The kernel > then issues half the requests, each twice as large, which is what this > SSD prefers (about +27% throughput here). Ah, OK, thanks for the details. So the default 128k read_ahead_kb is the culprit. We know it for a long time this default is too low for modern HW so most distro's actually tune this to 1m or similar in their default configurations. If you tune read_ahead_kb to 1m, does the difference for sequential read go away? And what about SQLite? > In other words, NSD does not bypass or reimplement the kernel > machinery. It tunes the ra_state window that the existing readahead > code then acts upon. Yes, understood. Honza -- Jan Kara <[email protected]> SUSE Labs, CR