Heya,

just a short blurb of what I understand from grokking dmu_zfetch.c

Basically the current code issues a prefetch (ie. create a new
prefecth stream) whenever a block (level 0, DB_RF_NOPREFETCH is not
set) is is read in dbuf_read.

Since ZFS is multi-threaded, we allow up to 8 such prefetch streams to
be running concurrently.

dmu_zfetch calls dmu_zfetch_find, which tries to categorize the access
pattern based on the current prefetch streams into 1 of 4 patterns:

1. Forward sequential access
2. Backward sequential access
3. Forward sequential strided access (does this mean we skip blocks,
but forwards?)
4. Backward sequential strided access (ditto...)

The new prefetch stream being created is then optimized for 1 of the 4 cases.

By default, we prefetch blocks in a forward manner: if the access
pattern doesn't match 1 of the 4 cases, or doesn't always work well
with a forward access pattern, then we suffer a potential performance
loss, in terms of wastage of bandwidth and arc_cache space.

Is this accurate? And what other performance pitfalls/corner cases are
there currently?

Thanks! :)

-- 
Regards,
Jeremy

Reply via email to