traverse_prefetcher does not prefetch enough
It was observed that the default value of zfs_pd_blks_max is 100, and may be insufficient for zfs send performance when using smaller recordsize files. The default setting is insufficient to drive throughput higher than 30MBps (on a test system). Increasing the # blocks to 700 increased performance. Rough observation was as follows:
pd_blks_max Throughput( backup_cb() )
700 70-80MBps (spikes over 100MBps)
Having 100 blocks when we're prefetching 128k blocks allows the sending thread to not have to block doing reads. This amounts to about 12MB of prefetched data but when we're sending 8K blocks it's less than 1MB of cached data.
It would be better if we specified the prefetch logic in terms of bytes rather than blocks. The prefetching thread would just read that many bytes ahead of the sending thread.
Updated by Electric Monk over 5 years ago
- % Done changed from 0 to 100
- Status changed from New to Closed
commit 34d7ce052c4565b078f73b95ccbd49274e98edaa Author: George Wilson <email@example.com> Date: 2015-03-24T16:56:58.000Z 5694 traverse_prefetcher does not prefetch enough Reviewed by: Matthew Ahrens <firstname.lastname@example.org> Reviewed by: Alex Reece <email@example.com> Reviewed by: Christopher Siden <firstname.lastname@example.org> Reviewed by: Josef 'Jeff' Sipek <email@example.com> Reviewed by: Bayard Bell <firstname.lastname@example.org> Approved by: Garrett D'Amore <email@example.com>