[RFC] vfs.read_min proposal
Maksim Yevmenkin
maksim.yevmenkin at gmail.com
Wed Mar 27 20:43:38 UTC 2013
Hello,
i would like to get some reviews, opinions and/or comments on the patch below.
a little bit background, as far as i understand, cluster_read() can
initiate two disk i/o's: one for exact amount of data being requested
(rounded up to a filesystem block size) and another for a configurable
read ahead. read ahead data are always extra and do not super set data
being requested. also, read ahead can be controlled via f_seqcount (on
per descriptor basis) and/or vfs.read_max (global knob).
in some cases and/or on some work loads it can be beneficial to bundle
original data and read ahead data in one i/o request. in other words,
read more than caller has requested, but only perform one larger i/o,
i.e. super set data being requested and read ahead.
===
Index: trunk/cache/src/sys/kern/vfs_cluster.c
===================================================================
diff -u -N -r515 -r1888
--- trunk/cache/src/sys/kern/vfs_cluster.c (.../vfs_cluster.c) (revision 515)
+++ trunk/cache/src/sys/kern/vfs_cluster.c (.../vfs_cluster.c) (revision 1888)
@@ -75,6 +75,10 @@
SYSCTL_INT(_vfs, OID_AUTO, read_max, CTLFLAG_RW, &read_max, 0,
"Cluster read-ahead max block count");
+static int read_min = 1;
+SYSCTL_INT(_vfs, OID_AUTO, read_min, CTLFLAG_RW, &read_min, 0,
+ "Cluster read min block count");
+
/* Page expended to mark partially backed buffers */
extern vm_page_t bogus_page;
@@ -169,13 +173,21 @@
} else {
off_t firstread = bp->b_offset;
int nblks;
+ long minread;
KASSERT(bp->b_offset != NOOFFSET,
("cluster_read: no buffer offset"));
ncontig = 0;
/*
+ * Adjust totread if needed
+ */
+ minread = read_min * size;
+ if (minread > totread)
+ totread = minread;
+
+ /*
* Compute the total number of blocks that we should read
* synchronously.
*/
===
thanks,
max
More information about the freebsd-current
mailing list