Certain Windows applications such as database applications need to ensure their I/O is committed to media, even at the cost of reduced throughput. However, at times an administrator has faith in the hardware and is willing to accept a small risk of data corruption in favor of a higher throughput by allowing caching to occur .
This is a 3 part blog that concentrates on the write caching behavior in the Windows storage stack.
- Part 1 presents an overview of the Windows storage stack with specific reference to write caching
- Part 2 presents the “knobs” an application programmer can twist and turn to affect write caching
- Part 3 presents the “knobs” a system administrator can twist and turn to affect write caching
Windows Storage Stack
Figure 1 Windows Storage I/O Stack
Figure 1 shows a simplified overview of the Windows Storage I/O stack. Starting from the top of Figure 1,
- Applications make I/O requests. Figure 1 concentrates on write requests and hence the unidirectional arrows from the application towards the disk media.
- Depending upon the nature of the I/O (decided partly by the way the application opens a file or volume), some I/O requests completely bypass the Windows Cache Manager and go straight from the file system to the Volume Manager layer. This is labeled Unbuffered I/O in Figure 1. As will be explained later, applications can ensure that their I/O is Unbuffered.
- Alternatively, Application I/O may traverse the buffered path labeled in Figure 1. While applications may strive to ensure their I/O is buffered, in reality, there is no way to ensure this. I/O is buffered depending upon a number of factors such as nature of file open, the type of I/O, the history of the application I/O, the load on the system, etc.
- The Volume Manager performs sector I/O. While the application may strive to ensure that there is no caching at the sector I/O level, the reality is that applications have limited success in some cases. This is discussed in more detail within the document.
Different types of Write Caching
Irrespective of whether the data is written at the file system level or at the disk block level, write caching can be broadly classified into two categories:
- Write-through caching: where data is written to cache AND also written to non volatile media. The data integrity is high, but write performance is slower whereas read performance is enhanced
- Writeback caching: where data is written to cache, the operating system write request is completed, and the data is lazily written to media at a later point in time. Writeback Caching emphasizes write performance, but at the possible loss of data integrity.
Part 2 of this blog will describe the APIs an application developer can use to control write caching behavior.