On Sun, 23 Sep 2007 09:20:49 +0800 Fengguang Wu <wfg@mail.ustc.edu.cn> wrote:It this the delta during one of these lockups? If so, it would seem that although dirty pages are reported against the BDI, no actual dirty inodes could be found. [ note to self: writeback_inodes() seems to write out to any superblock in the system. Might want to limit that to superblocks on wbc->bdi ] You say that switching to .23-rc6-mm1 solved it in your case. You are developing in the writeback_inodes() path, right? Could it be one of your local changes that confused it here? That is an interesting idea how about this: --- Subject: mm: speed up writeback ramp-up on clean systems We allow violation of bdi limits if there is a lot of room on the system. Once we hit half the total limit we start enforcing bdi limits and bdi ramp-up should happen. Doing it this way avoids many small writeouts on an otherwise idle system and should also speed up the ramp-up. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> --- Index: linux-2.6/mm/page-writeback.c =================================================================== --- linux-2.6.orig/mm/page-writeback.c +++ linux-2.6/mm/page-writeback.c @@ -355,8 +355,8 @@ get_dirty_limits(long *pbackground, long */ static void balance_dirty_pages(struct address_space *mapping) { - long bdi_nr_reclaimable; - long bdi_nr_writeback; + long nr_reclaimable, bdi_nr_reclaimable; + long nr_writeback, bdi_nr_writeback; long background_thresh; long dirty_thresh; long bdi_thresh; @@ -376,9 +376,24 @@ static void balance_dirty_pages(struct a get_dirty_limits(&background_thresh, &dirty_thresh, &bdi_thresh, bdi); + + nr_reclaimable = global_page_state(NR_FILE_DIRTY) + + global_page_state(NR_UNSTABLE_NFS); + nr_writeback = global_page_state(NR_WRITEBACK); + bdi_nr_reclaimable = bdi_stat(bdi, BDI_RECLAIMABLE); bdi_nr_writeback = bdi_stat(bdi, BDI_WRITEBACK); - if (bdi_nr_reclaimable + bdi_nr_writeback <= bdi_thresh) + + /* + * break out early when: + * - we're below the bdi limit + * - we're below half the total limit + * + * we let the numbers exceed the strict bdi limit if the total + * numbers are too low, this avoids (excessive) small writeouts. + */ + if (bdi_nr_reclaimable + bdi_nr_writeback <= bdi_thresh || + nr_reclaimable + nr_writeback < dirty_thresh / 2) break; if (!bdi->dirty_exceeded) -
| Bron Gondwana | BUG: mmapfile/writev spurious zero bytes (x86_64/not i386, bisected, reproducable) |
| Greg Kroah-Hartman | [PATCH 012/196] nozomi driver |
| J.C. Pizarro | Re: linux+glibc memory allocator, poor performance |
| Vladislav Bolkhovitin | Re: Integration of SCST in the mainstream Linux kernel |
git: | |
| Andy Parkins | svn:externals using git submodules |
| Linus Torvalds | Re: fatal: Out of memory, malloc failed |
| Peter Karlsson | RCS keyword expansion |
| Dennis Schridde | Odd number of elements in anonymous hash |
| Jarek Poplawski | [PATCH 00/14]: Killing qdisc->ops->requeue(). |
| jamal | [PATCH 2/3][NET_BATCH] net core use batching |
| Patrick McHardy | pkt_sched: add DRR scheduler |
| Marcel Holtmann | Bluetooth fixes for 2.6.27 |
| Charlie Clark | openbsd fail2ban |
| Hari | DHCP question |
| Richard Stallman | Real men don't attack straw men |
| Juan Miscaro | Not updating .libs-XXXXX, remember to clean it (huh?) |
