mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Vivek Goyal <vgoyal@redhat.com>
To: linux-kernel@vger.kernel.org, jens.axboe@oracle.com
Cc: containers@lists.linux-foundation.org, dm-devel@redhat.com,
	nauman@google.com, dpshah@google.com, lizf@cn.fujitsu.com,
	mikew@google.com, fchecconi@gmail.com, paolo.valente@unimore.it,
	ryov@valinux.co.jp, fernando@oss.ntt.co.jp,
	s-uchida@ap.jp.nec.com, taka@valinux.co.jp,
	guijianfeng@cn.fujitsu.com, jmoyer@redhat.com,
	dhaval@linux.vnet.ibm.com, balbir@linux.vnet.ibm.com,
	righi.andrea@gmail.com, m-ikeda@ds.jp.nec.com, agk@redhat.com,
	vgoyal@redhat.com, akpm@linux-foundation.org,
	peterz@infradead.org, jmarchan@redhat.com,
	torvalds@linux-foundation.org, mingo@elte.hu, riel@redhat.com
Subject: [PATCH 19/28] io-controller: Avoid expiring ioq for single ioq scheduler if only root group
Date: Thu, 24 Sep 2009 15:25:23 -0400	[thread overview]
Message-ID: <1253820332-10246-20-git-send-email-vgoyal@redhat.com> (raw)
In-Reply-To: <1253820332-10246-1-git-send-email-vgoyal@redhat.com>

o For io scheduler noop, deadline and AS, we maintain only one ioq per group.
  If people are using only flat mode where only root group is present, there
  will be only one ioq. In that case we can avoid queue expiration every
  100ms (dependent on slice_sync). This patch introduces this optimization.

o If an ioq is not expired for a long time and suddenly somebody
  decides to create a group and launch a job there, in that case old ioq
  queue will be expired with a very high value of slice used and will get
  a very high disk time. Fix it by marking the queue as "charge_one_slice"
  and charge the queue only for a single time slice and not for whole
  of the duration when queue was running.

o Introduce the notion of "real_served" and "virtual_served". real time is the
  actual time queue used and is visible through cgroup interface. virtual_time
  is the one we actually want to charge the queue for.  If a queue has not
  been expired for long time, real_time value will probably be high but we
  charge the queue for only one slice length.

Signed-off-by: Gui Jianfeng <guijianfeng@cn.fujitsu.com>
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
---
 block/elevator-fq.c |   75 +++++++++++++++++++++++++++++++++++++++++++++++++++
 block/elevator-fq.h |    3 ++
 2 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/block/elevator-fq.c b/block/elevator-fq.c
index b08a200..04419cf 100644
--- a/block/elevator-fq.c
+++ b/block/elevator-fq.c
@@ -902,6 +902,19 @@ static void elv_ioq_served(struct io_queue *ioq, unsigned long served)
 	queue_charge = group_charge = served;
 
 	/*
+	 * For single ioq schedulers we don't expire the queue if there are
+	 * no other competing groups. It might happen that once a queue has
+	 * not been expired for a long time, suddenly a new group is created
+	 * and IO comes in that new group. In that case, we don't want to
+	 * charge the old queue for whole of the period it was not expired.
+	 */
+
+	if (elv_ioq_charge_one_slice(ioq) && queue_charge > allocated_slice)
+		queue_charge = group_charge = allocated_slice;
+
+	elv_clear_ioq_charge_one_slice(ioq);
+
+	/*
 	 * We don't want to charge more than allocated slice otherwise this
 	 * queue can miss one dispatch round doubling max latencies. On the
 	 * other hand we don't want to charge less than allocated slice as
@@ -2143,6 +2156,37 @@ void elv_reset_request_ioq(struct request_queue *q, struct request *rq)
 	}
 }
 
+static inline int is_only_root_group(void)
+{
+	if (list_empty(&io_root_cgroup.css.cgroup->children))
+		return 1;
+
+	return 0;
+}
+
+/*
+ * One can do some optimizations for single ioq scheduler, when one does
+ * not have to expire the queue after every time slice is used. This avoids
+ * some unnecessary overhead, especially in AS where we wait for requests to
+ * finish from last queue before new queue is scheduled in.
+ */
+static inline int single_ioq_no_timed_expiry(struct request_queue *q)
+{
+	struct elv_fq_data *efqd = q->elevator->efqd;
+	struct io_queue *ioq = elv_active_ioq(q->elevator);
+
+	if (!elv_iosched_single_ioq(q->elevator))
+		return 0;
+
+	if (!is_only_root_group())
+		return 0;
+
+	if (efqd->busy_queues == 1 && ioq == efqd->root_group->ioq)
+		return 1;
+
+	return 0;
+}
+
 #else /* CONFIG_GROUP_IOSCHED */
 
 static inline unsigned int iog_weight(struct io_group *iog) { return 0; }
@@ -2188,6 +2232,17 @@ int elv_iog_should_idle(struct io_queue *ioq) { return 0; }
 EXPORT_SYMBOL(elv_iog_should_idle);
 static int elv_ioq_should_wait_busy(struct io_queue *ioq) { return 0; }
 
+static inline int is_only_root_group(void)
+{
+	return 1;
+}
+
+/* Never expire the single ioq in flat mode */
+static inline int single_ioq_no_timed_expiry(struct request_queue *q)
+{
+	return 1;
+};
+
 #endif /* CONFIG_GROUP_IOSCHED */
 
 /*
@@ -2794,6 +2849,16 @@ void *elv_select_ioq(struct request_queue *q, int force)
 		goto expire;
 	}
 
+	/*
+	 * If there is only root group present, don't expire the queue for
+	 * single queue ioschedulers (noop, deadline, AS).
+	 */
+
+	if (single_ioq_no_timed_expiry(q)) {
+		elv_mark_ioq_charge_one_slice(ioq);
+		goto keep_queue;
+	}
+
 	/* We are waiting for this group to become busy before it expires.*/
 	if (elv_iog_wait_busy(iog)) {
 		ioq = NULL;
@@ -3015,6 +3080,16 @@ void elv_ioq_completed_request(struct request_queue *q, struct request *rq)
 			elv_clear_ioq_slice_new(ioq);
 		}
 
+		/*
+		 * If there is only root group present, don't expire the queue
+		 * for single queue ioschedulers (noop, deadline, AS). It is
+		 * unnecessary overhead.
+		 */
+		if (single_ioq_no_timed_expiry(q)) {
+			elv_mark_ioq_charge_one_slice(ioq);
+			elv_log_ioq(efqd, ioq, "single ioq no timed expiry");
+			goto done;
+		}
 
 		/*
 		 * If there are no requests waiting in this queue, and
diff --git a/block/elevator-fq.h b/block/elevator-fq.h
index e60ceed..4114543 100644
--- a/block/elevator-fq.h
+++ b/block/elevator-fq.h
@@ -242,6 +242,8 @@ enum elv_queue_state_flags {
 	ELV_QUEUE_FLAG_slice_new,	  /* no requests dispatched in slice */
 	ELV_QUEUE_FLAG_sync,              /* synchronous queue */
 	ELV_QUEUE_FLAG_must_expire,       /* expire queue even slice is left */
+	ELV_QUEUE_FLAG_charge_one_slice,  /* Charge the queue for only one
+					   * time slice length */
 };
 
 #define ELV_IO_QUEUE_FLAG_FNS(name)					\
@@ -265,6 +267,7 @@ ELV_IO_QUEUE_FLAG_FNS(idle_window)
 ELV_IO_QUEUE_FLAG_FNS(slice_new)
 ELV_IO_QUEUE_FLAG_FNS(sync)
 ELV_IO_QUEUE_FLAG_FNS(must_expire)
+ELV_IO_QUEUE_FLAG_FNS(charge_one_slice)
 
 #ifdef CONFIG_GROUP_IOSCHED
 
-- 
1.6.0.6


  parent reply	other threads:[~2009-09-24 19:27 UTC|newest]

Thread overview: 177+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-24 19:25 IO scheduler based IO controller V10 Vivek Goyal
2009-09-24 19:25 ` [PATCH 01/28] io-controller: Documentation Vivek Goyal
2009-09-24 19:25 ` [PATCH 02/28] io-controller: Core of the elevator fair queuing Vivek Goyal
2009-09-24 19:25 ` [PATCH 03/28] io-controller: Keep a cache of recently expired queues Vivek Goyal
2009-09-24 19:25 ` [PATCH 04/28] io-controller: Common flat fair queuing code in elevaotor layer Vivek Goyal
2009-09-24 19:25 ` [PATCH 05/28] io-controller: Modify cfq to make use of flat elevator fair queuing Vivek Goyal
2009-09-24 19:25 ` [PATCH 06/28] io-controller: Core scheduler changes to support hierarhical scheduling Vivek Goyal
2009-09-24 19:25 ` [PATCH 07/28] io-controller: cgroup related changes for hierarchical group support Vivek Goyal
2009-09-24 19:25 ` [PATCH 08/28] io-controller: Common hierarchical fair queuing code in elevaotor layer Vivek Goyal
2009-09-24 19:25 ` [PATCH 09/28] io-controller: cfq changes to use " Vivek Goyal
2009-09-24 19:25 ` [PATCH 10/28] io-controller: Export disk time used and nr sectors dipatched through cgroups Vivek Goyal
2009-09-24 19:25 ` [PATCH 11/28] io-controller: Debug hierarchical IO scheduling Vivek Goyal
2009-09-24 19:25 ` [PATCH 12/28] io-controller: Introduce group idling Vivek Goyal
2009-09-24 19:25 ` [PATCH 13/28] io-controller: Implement wait busy for io queues Vivek Goyal
2009-09-24 19:25 ` [PATCH 14/28] io-controller: Keep track of late preemptions Vivek Goyal
2009-09-24 19:25 ` [PATCH 15/28] io-controller: Allow CFQ specific extra preemptions Vivek Goyal
2009-09-25  6:24   ` Gui Jianfeng
2009-09-24 19:25 ` [PATCH 16/28] io-controller: Wait for requests to complete from last queue before new queue is scheduled Vivek Goyal
2009-09-24 19:25 ` [PATCH 17/28] io-controller: Separate out queue and data Vivek Goyal
2009-09-24 19:25 ` [PATCH 18/28] io-conroller: Prepare elevator layer for single queue schedulers Vivek Goyal
2009-09-24 19:25 ` Vivek Goyal [this message]
2009-09-24 19:25 ` [PATCH 20/28] io-controller: noop changes for hierarchical fair queuing Vivek Goyal
2009-09-24 19:25 ` [PATCH 21/28] io-controller: deadline " Vivek Goyal
2009-09-24 19:25 ` [PATCH 22/28] io-controller: anticipatory " Vivek Goyal
2009-09-24 19:25 ` [PATCH 23/28] io-controller: blkio_cgroup patches from Ryo to track async bios Vivek Goyal
2009-09-24 19:25 ` [PATCH 24/28] io-controller: map async requests to appropriate cgroup Vivek Goyal
2009-09-24 19:25 ` [PATCH 25/28] io-controller: Per cgroup request descriptor support Vivek Goyal
2009-09-24 19:25 ` [PATCH 26/28] io-controller: Per io group bdi congestion interface Vivek Goyal
2009-09-24 19:25 ` [PATCH 27/28] io-controller: Support per cgroup per device weights and io class Vivek Goyal
2009-09-24 19:25 ` [PATCH 28/28] io-controller: debug elevator fair queuing support Vivek Goyal
2009-09-24 21:33 ` IO scheduler based IO controller V10 Andrew Morton
2009-09-25  1:09   ` KAMEZAWA Hiroyuki
2009-09-25  1:18     ` KAMEZAWA Hiroyuki
2009-09-25  5:29       ` Balbir Singh
2009-09-25  7:09         ` Ryo Tsuruta
2009-09-25  4:14     ` Vivek Goyal
2009-09-25  5:04   ` Vivek Goyal
2009-09-25  9:07     ` Ryo Tsuruta
2009-09-25 14:33       ` Vivek Goyal
2009-09-28  7:30         ` Ryo Tsuruta
2009-09-25 15:04       ` Rik van Riel
2009-09-28  7:38         ` Ryo Tsuruta
2009-10-08  4:42   ` More performance numbers (Was: Re: IO scheduler based IO controller V10) Vivek Goyal
2009-10-08  8:34     ` Andrea Righi
2009-10-10 19:53   ` Performance numbers with IO throttling patches " Vivek Goyal
2009-10-10 22:27     ` Andrea Righi
2009-10-11 12:32       ` Vivek Goyal
2009-10-12 21:11       ` Vivek Goyal
2009-10-17 15:18         ` Andrea Righi
2009-09-25  2:20 ` IO scheduler based IO controller V10 Ulrich Lukas
2009-09-25 20:26   ` Vivek Goyal
2009-09-26 14:51     ` Mike Galbraith
2009-09-27  6:55       ` Mike Galbraith
2009-09-27 16:42         ` Jens Axboe
2009-09-27 18:15           ` Mike Galbraith
2009-09-28  4:04             ` Mike Galbraith
2009-09-28  5:55               ` Mike Galbraith
2009-09-28 17:48               ` Vivek Goyal
2009-09-28 18:24                 ` Mike Galbraith
2009-09-30 19:58           ` Mike Galbraith
2009-09-30 20:05             ` Mike Galbraith
2009-09-30 20:24               ` Vivek Goyal
2009-10-01  7:33                 ` Mike Galbraith
2009-10-01 18:58                   ` Jens Axboe
2009-10-02  6:23                     ` Mike Galbraith
2009-10-02  8:04                       ` Jens Axboe
2009-10-02  8:53                         ` Mike Galbraith
2009-10-02  9:00                           ` Mike Galbraith
2009-10-02  9:55                           ` Jens Axboe
2009-10-02 12:22                             ` Mike Galbraith
2009-10-02  9:24                         ` Ingo Molnar
2009-10-02  9:28                           ` Jens Axboe
2009-10-02 14:24                             ` Linus Torvalds
2009-10-02 14:45                               ` Mike Galbraith
2009-10-02 14:57                                 ` Jens Axboe
2009-10-02 14:56                               ` Jens Axboe
2009-10-02 15:14                                 ` Linus Torvalds
2009-10-02 16:01                                   ` jim owens
2009-10-02 17:11                                   ` Jens Axboe
2009-10-02 17:20                                     ` Ingo Molnar
2009-10-02 17:25                                       ` Jens Axboe
2009-10-02 17:28                                         ` Ingo Molnar
2009-10-02 17:37                                           ` Jens Axboe
2009-10-02 17:56                                             ` Ingo Molnar
2009-10-02 18:04                                               ` Jens Axboe
2009-10-02 18:22                                                 ` Mike Galbraith
2009-10-02 18:26                                                   ` Jens Axboe
2009-10-02 18:33                                                     ` Mike Galbraith
2009-10-02 18:36                                                 ` Theodore Tso
2009-10-02 18:45                                                   ` Jens Axboe
2009-10-02 19:01                                                     ` Ingo Molnar
2009-10-02 19:09                                                       ` Jens Axboe
2009-10-02 18:13                                             ` Mike Galbraith
2009-10-02 18:19                                               ` Jens Axboe
2009-10-02 18:57                                                 ` Mike Galbraith
2009-10-02 20:47                                                   ` Mike Galbraith
2009-10-03  5:48                                                 ` Mike Galbraith
2009-10-03  5:56                                                   ` Mike Galbraith
2009-10-03  6:31                                                     ` tweaking IO latency [was Re: IO scheduler based IO controller V10] Mike Galbraith
2009-10-03  7:24                                                     ` IO scheduler based IO controller V10 Jens Axboe
2009-10-03  9:00                                                       ` Mike Galbraith
2009-10-03  9:12                                                         ` Corrado Zoccolo
2009-10-03 13:18                                                           ` Jens Axboe
2009-10-03 13:17                                                         ` Jens Axboe
2009-10-03 11:29                                                     ` Vivek Goyal
2009-10-03 12:40                                                       ` Do not overload dispatch queue (Was: Re: IO scheduler based IO controller V10) Vivek Goyal
2009-10-03 13:21                                                         ` Jens Axboe
2009-10-03 13:56                                                           ` Vivek Goyal
2009-10-03 14:02                                                             ` Mike Galbraith
2009-10-03 14:28                                                               ` Jens Axboe
2009-10-03 14:33                                                                 ` Mike Galbraith
2009-10-03 14:51                                                                 ` Mike Galbraith
2009-10-03 15:14                                                                   ` Jens Axboe
2009-10-03 15:57                                                                     ` Mike Galbraith
2009-10-03 17:35                                                                       ` Jens Axboe
2009-10-03 17:45                                                                         ` Linus Torvalds
2009-10-03 17:51                                                                           ` Jens Axboe
2009-10-03 19:07                                                                         ` Mike Galbraith
2009-10-03 19:11                                                                           ` Mike Galbraith
2009-10-03 19:23                                                                           ` Jens Axboe
2009-10-03 19:49                                                                             ` Mike Galbraith
2009-10-04 10:50                                                                               ` Mike Galbraith
2009-10-04 11:33                                                                                 ` Mike Galbraith
2009-10-04 17:39                                                                                 ` Jens Axboe
2009-10-04 18:23                                                                                   ` Mike Galbraith
2009-10-04 18:38                                                                                     ` Jens Axboe
2009-10-04 19:47                                                                                       ` Mike Galbraith
2009-10-04 20:17                                                                                         ` Jens Axboe
2009-10-04 22:15                                                                                           ` Mike Galbraith
2009-10-03 13:57                                                         ` Mike Galbraith
2009-10-03  7:20                                                   ` IO scheduler based IO controller V10 Ingo Molnar
2009-10-03  7:25                                                     ` Jens Axboe
2009-10-03  8:53                                                       ` Mike Galbraith
2009-10-03  9:01                                                       ` Corrado Zoccolo
2009-10-02 16:33                                 ` Ray Lee
2009-10-02 17:13                                   ` Jens Axboe
2009-10-02 16:22                               ` Ingo Molnar
2009-10-02  9:36                           ` Mike Galbraith
2009-10-02 16:37                             ` Ingo Molnar
2009-10-02 18:08                   ` Jens Axboe
2009-10-02 18:29                     ` Mike Galbraith
2009-10-02 18:36                       ` Jens Axboe
2009-09-27 17:00     ` Corrado Zoccolo
2009-09-28 14:56       ` Vivek Goyal
2009-09-28 15:35         ` Corrado Zoccolo
2009-09-28 17:14           ` Vivek Goyal
2009-09-29  7:10             ` Corrado Zoccolo
2009-09-28 17:51           ` Mike Galbraith
2009-09-28 18:18             ` Vivek Goyal
2009-09-28 18:53               ` Mike Galbraith
2009-09-29  7:14                 ` Corrado Zoccolo
2009-09-29  5:55             ` Mike Galbraith
2009-09-29  0:37 ` Nauman Rafique
2009-09-29  3:22   ` Vivek Goyal
2009-09-29  9:56     ` Ryo Tsuruta
2009-09-29 10:49       ` Takuya Yoshikawa
2009-09-29 14:10       ` Vivek Goyal
2009-09-29 19:53         ` Nauman Rafique
2009-09-30  8:43         ` Ryo Tsuruta
2009-09-30 11:05           ` Vivek Goyal
2009-10-01  6:41             ` Ryo Tsuruta
2009-10-01 13:31               ` Vivek Goyal
2009-10-02  2:57                 ` Vivek Goyal
2009-10-02 20:27                   ` Munehiro Ikeda
2009-10-05 10:38                     ` Ryo Tsuruta
2009-10-05 12:31                       ` Vivek Goyal
2009-10-05 14:55                         ` Ryo Tsuruta
2009-10-05 17:10                           ` Vivek Goyal
2009-10-05 18:11                             ` Nauman Rafique
2009-10-06  7:17                               ` Ryo Tsuruta
2009-10-06 11:22                                 ` Vivek Goyal
2009-10-07 14:38                                   ` Ryo Tsuruta
2009-10-07 15:09                                     ` Vivek Goyal
2009-10-08  2:18                                       ` Ryo Tsuruta
2009-10-07 16:41                                     ` Rik van Riel
2009-10-08 10:22                                       ` Ryo Tsuruta
2009-09-30  3:11       ` Vivek Goyal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1253820332-10246-20-git-send-email-vgoyal@redhat.com \
    --to=vgoyal@redhat.com \
    --cc=agk@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=balbir@linux.vnet.ibm.com \
    --cc=containers@lists.linux-foundation.org \
    --cc=dhaval@linux.vnet.ibm.com \
    --cc=dm-devel@redhat.com \
    --cc=dpshah@google.com \
    --cc=fchecconi@gmail.com \
    --cc=fernando@oss.ntt.co.jp \
    --cc=guijianfeng@cn.fujitsu.com \
    --cc=jens.axboe@oracle.com \
    --cc=jmarchan@redhat.com \
    --cc=jmoyer@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizf@cn.fujitsu.com \
    --cc=m-ikeda@ds.jp.nec.com \
    --cc=mikew@google.com \
    --cc=mingo@elte.hu \
    --cc=nauman@google.com \
    --cc=paolo.valente@unimore.it \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --cc=righi.andrea@gmail.com \
    --cc=ryov@valinux.co.jp \
    --cc=s-uchida@ap.jp.nec.com \
    --cc=taka@valinux.co.jp \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome