Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Mar 2013 13:43:32 -0700
From:      Maksim Yevmenkin <maksim.yevmenkin@gmail.com>
To:        current@freebsd.org
Subject:   [RFC] vfs.read_min proposal
Message-ID:  <CAFPOs6rNDZTqWJZ3hK=px5RX5G44Z3hfzCLQcfceQ2n_7oU3GA@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFPOs6rNDZTqWJZ3hK=px5RX5G44Z3hfzCLQcfceQ2n_7oU3GA>