> Il giorno 18 mag 2019, alle ore 21:28, Theodore Ts'o <tytso@xxxxxxx> ha scritto: > > On Sat, May 18, 2019 at 08:39:54PM +0200, Paolo Valente wrote: >> I've addressed these issues in my last batch of improvements for >> BFQ, which landed in the upcoming 5.2. If you give it a try, and >> still see the problem, then I'll be glad to reproduce it, and >> hopefully fix it for you. > > Hi Paolo, I'm curious if you could give a quick summary about what you > changed in BFQ? > Here is the idea: while idling for a process, inject I/O from other processes, at such an extent that no harm is caused to the process for which we are idling. Details in this LWN article: https://lwn.net/Articles/784267/ in section "Improving extra-service injection". > I was considering adding support so that if userspace calls fsync(2) > or fdatasync(2), to attach the process's CSS to the transaction, and > then charge all of the journal metadata writes the process's CSS. If > there are multiple fsync's batched into the transaction, the first > process which forced the early transaction commit would get charged > the entire journal write. OTOH, journal writes are sequential I/O, so > the amount of disk time for writing the journal is going to be > relatively small, and especially, the fact that work from other > cgroups is going to be minimal, especially if hadn't issued an > fsync(). > Yeah, that's a longstanding and difficult instance of the general too-short-blanket problem. Jan has already highlighted one of the main issues in his reply. I'll add a design issue (from my point of view): I'd find a little odd that explicit sync transactions have an owner to charge, while generic buffered writes have not. I think Andrea Righi addressed related issues in his recent patch proposal [1], so I've CCed him too. [1] https://lkml.org/lkml/2019/3/9/220 > In the case where you have three cgroups all issuing fsync(2) and they > all landed in the same jbd2 transaction thanks to commit batching, in > the ideal world we would split up the disk time usage equally across > those three cgroups. But it's probably not worth doing that... > > That being said, we probably do need some BFQ support, since in the > case where we have multiple processes doing buffered writes w/o fsync, > we do charnge the data=ordered writeback to each block cgroup. Worse, > the commit can't complete until the all of the data integrity > writebacks have completed. And if there are N cgroups with dirty > inodes, and slice_idle set to 8ms, there is going to be 8*N ms worth > of idle time tacked onto the commit time. > Jan already wrote part of what I wanted to reply here, so I'll continue from his reply. Thanks, Paolo > If we charge the journal I/O to the cgroup, and there's only one > process doing the > > dd if=/dev/zero of=/root/test.img bs=512 count=10000 oflags=dsync > > then we don't need to worry about this failure mode, since both the > journal I/O and the data writeback will be hitting the same cgroup. > But that's arguably an artificial use case, and much more commonly > there will be multiple cgroups all trying to at least some file system > I/O. > > - Ted
Attachment:
signature.asc
Description: Message signed with OpenPGP