io/file_sector_source: throttle readahead for NFS bidirectional workloads
Empirical regression observed during 0.21.1 mux test on rip1/unraid-1: historical 0.20.7 baseline averaged ~18 MB/s mux throughput; 0.21.1 dropped to ~7-8 MB/s flat. Same NFS source + destination, same disc. Suspect: 32 MiB FileSectorSource readahead + posix_fadvise(SEQUENTIAL) together saturate the TCP connection on read bursts, starving the writer thread's concurrent NFS writes (mux reads the source ISO and writes the MKV over the same connection). - READAHEAD_BUF_BYTES: 32 MiB -> 4 MiB. Matches NFS rsize=1 MiB * 4 round-trips per refill, interleaves cleanly with writes. - linux/hint_sequential: now no-op. Kernel's default ~128 KiB readahead is what we want on NFS-backed ISOs (the dominant case). Per-OS file stays so we can re-enable a hint cleanly later if a different path benefits.
This commit is contained in:
@@ -65,8 +65,15 @@ use crate::sector::SectorSource;
|
||||
/// than per-sector pread, and large enough to coast through a typical
|
||||
/// NFS server commit blip.
|
||||
///
|
||||
/// 0.21.2: shrunk from 32 MiB → 4 MiB. On NFS-backed ISOs with
|
||||
/// concurrent NFS writes (the mux phase), a 32 MiB refill bursts the
|
||||
/// TCP connection hard enough to starve the writer thread, observed
|
||||
/// empirically as a ~3× drop in sustained mux throughput on the
|
||||
/// rip1/unraid-1 setup. 4 MiB matches `rsize=1 MiB` × 4 round-trips
|
||||
/// and interleaves cleanly with writes.
|
||||
///
|
||||
/// Tweakable. Named const, not a magic number.
|
||||
pub const READAHEAD_BUF_BYTES: usize = 32 * 1024 * 1024;
|
||||
pub const READAHEAD_BUF_BYTES: usize = 4 * 1024 * 1024;
|
||||
|
||||
const SECTOR_SIZE: usize = 2048;
|
||||
/// Sectors per refill: [`READAHEAD_BUF_BYTES`] / [`SECTOR_SIZE`]. The
|
||||
|
||||
Reference in New Issue
Block a user