There are two kinds of prefetch requests: (i) synchronous prefetch, and (ii) asynchronous prefetch. A synchronous prefetch is when on a miss on page , we prefetch extra pages beyond page . It merely extends the extent of the client's read request to include more pages. On the other hand, an asynchronous prefetch is when on a cache hit on a page , we create a new read request to prefetch pages beyond those already in the cache. In each set of prefetched pages, a trigger page is identified at a trigger distance of from the end of the prefetched set of pages (Figure 1). When , the trigger is set on the last page of the prefetched set. When a trigger page is hit, an asynchronous prefetch is requested for the next set of sequential pages. Unlike synchronous prefetching, asynchronous prefetching enables us to always stay ahead of sequential read requests and for suitable values of and , never incur a read miss after the initial miss for a sequential stream . Asynchronous prefetching is always used in conjunction with some form of synchronous prefetching to prefetch the initial set of pages.
Notice that asynchronous prefetching creates new read requests on its own and, therefore, in cases where prefetches are wasted, asynchronous prefetching will have more disk seeks on the backend for the same workload than synchronous prefetching. However, for larger prefetches on data striped across disks, even synchronous prefetches will result in new read requests.
As a guideline, asynchronous prefetching should be avoided in cases where prefetch wastage is high.