I agree with your problem description, a single program which writes a single
large file can make an interactive system suck. Creating a 25+GB Blu-Ray image
will often saturate the buffer space. I played with per-fd limiting during
2.5.xx development and I had an app writing 5-10GB files. While I wanted to get
something to submit while the kernel was changing, I kept hitting cornet cases.
I think you have this in the wrong place, can't it go in balance_dirty_pages?
I found that the effect was about the same as forcing the application to use
O_DIRECT, and since it was our application I could do that. Not all
badly-behaved programs are open source, so that addressed my issue but not the
general case.
I think you really need to track by process, not file, as you said "Even though
this dirtier may not be the one who dirtied the other pages of this file..."
that doesn't work, you block a process which is contributing minimally to the
problem while letting the real problem process continue. Ex: a log file, with
one process spewing error messages while others write a few lines/min. You have
to get it right, I think.
--
Bill Davidsen <davidsen@tmr.com>
"We have more to fear from the bungling of the incompetent than from
the machinations of the wicked." - from Slashdot
--