linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* PATCH: automatic tuning of swap token timeout
@ 2004-12-11 19:24 Rik van Riel
  0 siblings, 0 replies; only message in thread
From: Rik van Riel @ 2004-12-11 19:24 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: linux-mm

At Marcelo's request.  I made this patch a while ago so I'm
not sure if it will still apply to the recent kernel, but it
should give you an idea of what I tried to achieve.

The idea is to keep the swap token timeout short on a system
with mostly small tasks, even if there is one big hog running
in the background.  The big thrashing program should not hold
the swap token for unfair amounts of time.

The swap token timeout should be the minimum required to keep
most of the processes in the system from thrashing, while
keeping some amount of fairness.

This patch is untested.  Have fun.

===== mm/thrash.c 1.2 vs edited =====
--- 1.2/mm/thrash.c	Wed Oct 20 04:37:11 2004
+++ edited/mm/thrash.c	Mon Nov  1 22:35:01 2004
@@ -19,10 +19,44 @@
  struct mm_struct * swap_token_mm = &init_mm;

  #define SWAP_TOKEN_CHECK_INTERVAL (HZ * 2)
-#define SWAP_TOKEN_TIMEOUT (HZ * 300)
+#define MIN_SWAP_TOKEN_TIMEOUT (2 * SWAP_TOKEN_CHECK_INTERVAL)
+#define SWAP_TOKEN_TIMEOUT (HZ * 30)
+#define MAX_SWAP_TOKEN_TIMEOUT (HZ * 300)
  unsigned long swap_token_default_timeout = SWAP_TOKEN_TIMEOUT;

  /*
+ * We count how often the swap token times out, and how often the
+ * swap token hold time is long enough for processes to regain their
+ * working set and make progress.
+ *
+ * The goal is to have processes in the system make progress, with the
+ * lowest possible latency.  If the token times out too often, processes
+ * are not making progress and the timeout needs to be increased.  If
+ * processes are making progress, we can decrease the timeout and improve
+ * system latency.
+ */
+#define SWAP_TOKEN_RECALC 32
+#define SWAP_TOKEN_TOO_LONG 1
+static int swap_token_timed_out;
+static int swap_token_enough_rss;
+
+static void recalculate_swap_token_timeout(void)
+{
+	unsigned long delta = (swap_token_default_timeout / 4) + 1;
+	if (swap_token_timed_out > SWAP_TOKEN_TOO_LONG) {
+		swap_token_default_timeout += delta;
+		if (swap_token_default_timeout > MAX_SWAP_TOKEN_TIMEOUT)
+			swap_token_default_timeout = MAX_SWAP_TOKEN_TIMEOUT;
+	} else {
+		swap_token_default_timeout -= delta;
+		if (swap_token_default_timeout < MIN_SWAP_TOKEN_TIMEOUT)
+			swap_token_default_timeout = MIN_SWAP_TOKEN_TIMEOUT;
+	}
+	swap_token_enough_rss /= 2;
+	swap_token_timed_out /= 2;
+}
+
+/*
   * Take the token away if the process had no page faults
   * in the last interval, or if it has held the token for
   * too long.
@@ -32,11 +66,18 @@
  static int should_release_swap_token(struct mm_struct *mm)
  {
  	int ret = 0;
-	if (!mm->recent_pagein)
+	if (!mm->recent_pagein) {
+		swap_token_enough_rss++;
  		ret = SWAP_TOKEN_ENOUGH_RSS;
-	else if (time_after(jiffies, swap_token_timeout))
+	} else if (time_after(jiffies, swap_token_timeout)) {
+		swap_token_timed_out++;
  		ret = SWAP_TOKEN_TIMED_OUT;
+	}
  	mm->recent_pagein = 0;
+
+	if (swap_token_timed_out + swap_token_enough_rss > SWAP_TOKEN_RECALC)
+		recalculate_swap_token_timeout();
+
  	return ret;
  }

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"aart@kvack.org"> aart@kvack.org </a>

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-12-11 19:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-11 19:24 PATCH: automatic tuning of swap token timeout Rik van Riel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox