Re: [ck] 2.6.7 backport request, spinoff idea

From: Rik van Riel
Date: Sat Dec 18 2004 - 23:29:05 EST


On Sun, 19 Dec 2004, Con Kolivas wrote:

Sorry for cc'ing the wrong email Rik. Do you have a simple link to the patch or can you send it on this thread please?

Here it is. The patch should have the effect of reducing the
swap token timeout to the minimum value at times when there is
little to no memory pressure, while allowing it to grow in times
where it is needed.


Date: Sat, 11 Dec 2004 14:24:15 -0500 (EST)
From: Rik van Riel <riel@xxxxxxxxxx>
To: Marcelo Tosatti <marcelo.tosatti@xxxxxxxxxxxx>
Cc: linux-mm@xxxxxxxxx
Subject: PATCH: automatic tuning of swap token timeout

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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/