lkml.org 
[lkml]   [2006]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH 19/28] readahead: initial method
Aggressive readahead policy for read on start-of-file.

Instead of selecting a conservative readahead size,
it tries to do large readahead in the first place.

However we have to watch on two cases:
- do not ruin the hit rate for file-head-checkers
- do not lead to thrashing for memory tight systems

In most cases, the threat of file-head-peakers is neglectable. So a simple
user tunable parameter is used. Users can try a larger initial read-ahead
size:
echo 128 > /sys/block/sda/queue/initial_ra_kb

It benefits the many-small-files case:

adaptive readahead: avg 10.3 seconds
====================================

stock readahead: avg 12.3 seconds
=================================

The rxvt-unicode-7.7 being benchmarked is a dir with many .C/.h/.o files.

Signed-off-by: Wu Fengguang <wfg@mail.ustc.edu.cn>
Signed-off-by: Andrew Morton <akpm@osdl.org>
--- linux-2.6.19-rc5-mm2.orig/mm/readahead.c
+++ linux-2.6.19-rc5-mm2/mm/readahead.c
@@ -1440,6 +1440,42 @@ has_history_pages:
}

/*
+ * Read-ahead on start of file.
+ *
+ * We want to be as aggressive as possible, _and_
+ * - do not ruin the hit rate for file-head-peekers
+ * - do not lead to thrashing for memory tight systems
+ */
+static unsigned long
+initial_readahead(struct address_space *mapping, struct file *filp,
+ struct file_ra_state *ra, unsigned long req_size)
+{
+ struct backing_dev_info *bdi = mapping->backing_dev_info;
+ unsigned long thrash_pages = bdi->ra_thrash_bytes >> PAGE_CACHE_SHIFT;
+ unsigned long ra_size;
+ unsigned long la_size;
+
+ ra_size = req_size;
+
+ /* user imposed minimal size */
+ if (ra_size < bdi->ra_pages0)
+ ra_size = bdi->ra_pages0;
+
+ /* no read-ahead thrashing */
+ if (ra_size > thrash_pages)
+ ra_size = thrash_pages;
+
+ /* do look-ahead on large(>= 32KB) read-ahead */
+ la_size = ra_size / LOOKAHEAD_RATIO;
+
+ ra_set_class(ra, RA_CLASS_INITIAL);
+ ra_set_index(ra, 0, 0);
+ ra_set_size(ra, ra_size, la_size);
+
+ return ra_submit(ra, mapping, filp);
+}
+
+/*
* ra_min is mainly determined by the size of cache memory. Reasonable?
*
* Table of concrete numbers for 4KB page size:
--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-11-15 09:01    [W:0.100 / U:3.904 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site