On Fri, Aug 21, 2009 at 04:24:59PM +0100, Jamie Lokier wrote: > In measurements I've done, disabling a disk's write cache results in > much slower ext3 filesystem writes than using barriers. Others report > similar results. This is with disks that don't have NCQ; good NCQ may > be better. On a scsi disk and a SATA SSD with NCQ I get different results. Most worksloads, in particular metadata-intensive ones and large streaming writes are noticably better just turning off the write cache. The only onces that benefit from it are relatively small writes witout O_SYNC or much fsyncs. This is however using XFS which tends to issue much more barriers than ext3. > Using FUA for all writes should be equivalent to writing with write > cache disabled. > > A journalling filesystem or database tends to write like this: > > (guest) WRITE > (guest) WRITE > (guest) WRITE > (guest) WRITE > (guest) WRITE > (guest) CACHE FLUSH > (guest) WRITE > (guest) CACHE FLUSH > (guest) WRITE > (guest) WRITE > (guest) WRITE In the optimal case, yeah. > Assuming that WRITE FUA is equivalent to disabling write cache, we may > expect the WRITE FUA version to run much slower than the CACHE FLUSH > version. For a workload that only does FUA writes, yeah. That is however the use case for virtual machines. As I'm looking into those issues I will run some benchmarks comparing both variants. > It's also too weak, of course, on drives which don't support FUA. > Then you have to use CACHE FLUSH anyway, so the code should support > that (or disable the write cache entirely, which also performs badly). > If you don't handle drives without FUA, then you're back to "integrity > sometimes, user must check type of hardware", which is something we're > trying to get away from. Integrity should not be a surprise when the > application requests it. As mentioned in the previous mails FUA would only be an optimization (if it ends up helping) we do need to support the cache flush case. > > I thought about this alot . It would be sensible to only require > > the FUA semantics if O_SYNC is specified. But from looking around at > > users of O_DIRECT no one seems to actually specify O_SYNC with it. > > O_DIRECT with true POSIX O_SYNC is a bad idea, because it flushes > inode metadata (like mtime) too. O_DIRECT|O_DSYNC is better. O_SYNC above is the Linux O_SYNC aka Posix O_DYNC. > O_DIRECT without O_SYNC, O_DSYNC, fsync or fdatasync is asking for > integrity problems when direct writes are converted to buffered writes > - which applies to all or nearly all OSes according to their > documentation (I've read a lot of them). It did not happen on IRIX where O_DIRECT originated that did not happen, neither does it happen on Linux when using XFS. Then again at least on Linux we provide O_SYNC (that is Linux O_SYNC, aka Posix O_DYSC) semantics for that case. > Imho, integrity should not be something which depends on the user > knowing the details of their hardware to decide application > configuration options - at least, not out of the box. That is what I meant. Only doing cache flushes/FUA for O_DIRECT|O_DSYNC is not what users naively expect. And the wording in hour manpages also suggests this behaviour, although it is not entirely clear: O_DIRECT (Since Linux 2.4.10) Try to minimize cache effects of the I/O to and from this file. In general this will degrade performance, but it is useful in special situations, such as when applications do their own caching. File I/O is done directly to/from user space buffers. The I/O is synchronous, that is, at the completion of a read(2) or write(2), data is guaranteed to have been transferred. See NOTES below forfurther discussion. (And yeah, the whole wording is horrible, I will send an update once we've sorted out the semantics, including caveats about older kernels) > > And on Linux where O_SYNC really means O_DYSNC that's pretty sensible - > > if O_DIRECT bypasses the filesystem cache there is nothing else > > left to sync for a non-extending write. > > Oh, O_SYNC means O_DSYNC? I thought it was the other way around. > Ugh, how messy. Yes. Except when using XFS and using the "osyncisosync" mount option :) > > The fallback was a relatively recent addition to the O_DIRECT semantics > > for broken filesystems that can't handle holes very well. Fortunately > > enough we do force O_SYNC (that is Linux O_SYNC aka Posix O_DSYNC) > > semantics for that already. > > Ok, so you're saying there's no _harm_ in specifying O_DSYNC with > O_DIRECT either? :-) No. In the generic code and filesystems I looked at it simply has no effect at all. -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html