在虚拟化场景下,从虚拟机来的io,首先被传输到存储后端,xen在dom0上,kvm在内核或者qemu上。 如果在后端走buffer io,则数据被写到page cache后就返回了,从虚拟机的角度来看,认为这个IO 已经被写到存储里去了,这时候如果掉电,虚拟机已经被写入的数据有可能被丢弃。这是不可接受的。 这和正在写时掉电IO 丢失是不同的。
如果你不理解在虚拟化场景下,存储后端不能使用buffer IO, 你看看SAN (包括IPSAN和FCSAN)的情况就明白了,一般SAN 支持write back和write through. write back就是对应buffer IO. 数据写到SAN 的cache后,就返回IO 写入成功。那这时候SAN 断电了呢,SAN 对cache 的内存都有断电保护,当SAN 断电时,启用专门保护SAN cache的电池,保证能把cache的数据写入到磁盘。 如果SAN 的电池老化后不能使用,则不能设置write back,已经设置的也会变成write through.