Skip to contentSkip to conversation

O20int

PATCH In review Con Kolivas 3 participants 7 messages Sep 3, 2003 – Sep 7, 2003

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 O20int

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Fine tuning mainly.

Smaller timeslice granularity for most interactive tasks and larger for less interactive. Smaller for each extra cpu.

Smaller bounds on interactive credit.

Idle tasks can gain interactive credits; Idle tasks get more interactivity; Uninterruptible sleep wakers are not seen as idle.

Kernel threads participate in timeslice granularity requeuing.

This patch is incremental on top of O19int which is included in 2.6.0-test4-mm4. It will not apply onto mm5 which has all my stuff backed out. This patch and a full patch against 2.6.0-test4 can be found here:

http://kernel.kolivas.org/2.5

Con
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)

iD8DBQE/VgBaZUg7+tp6mRURAtvgAJoClT078T9wLLlEq8+pct3Yigrq3wCgja4P HjXKw3YJSey4DWpA2I+Tyi4=
=nvCB
-----END PGP SIGNATURE-----

kernel/sched.c +24 -11
@@ -76,7 +76,6 @@
  */
 #define MIN_TIMESLICE		( 10 * HZ / 1000)
 #define MAX_TIMESLICE		(200 * HZ / 1000)
-#define TIMESLICE_GRANULARITY	(HZ/40 ?: 1)
 #define ON_RUNQUEUE_WEIGHT	30
 #define CHILD_PENALTY		95
 #define PARENT_PENALTY		100
@@ -88,6 +87,7 @@
 #define STARVATION_LIMIT	(MAX_SLEEP_AVG)
 #define NS_MAX_SLEEP_AVG	(JIFFIES_TO_NS(MAX_SLEEP_AVG))
 #define NODE_THRESHOLD		125
+#define CREDIT_LIMIT		100
 
 /*
  * If a task is 'interactive' then we reinsert it in the active
@@ -121,6 +121,15 @@
 	(NS_TO_JIFFIES((p)->sleep_avg) * MAX_BONUS / \
 		MAX_SLEEP_AVG)
 
+#ifdef CONFIG_SMP
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * \
+		num_online_cpus())
+#else
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))))
+#endif
+
 #define SCALE(v1,v1_max,v2_max) \
 	(v1) * (v2_max) / (v1_max)
 
@@ -136,10 +145,10 @@
 		(MAX_BONUS / 2 + DELTA((p)) + 1) / MAX_BONUS - 1))
 
 #define HIGH_CREDIT(p) \
-	((p)->interactive_credit > MAX_SLEEP_AVG)
+	((p)->interactive_credit > CREDIT_LIMIT)
 
 #define LOW_CREDIT(p) \
-	((p)->interactive_credit < -MAX_SLEEP_AVG)
+	((p)->interactive_credit < -CREDIT_LIMIT)
 
 #define TASK_PREEMPTS_CURR(p, rq) \
 	((p)->prio < (rq)->curr->prio)
@@ -383,9 +392,13 @@ static void recalc_task_prio(task_t *p, 
 		 * prevent them suddenly becoming cpu hogs and starving
 		 * other processes.
 		 */
-		if (p->mm && sleep_time >JUST_INTERACTIVE_SLEEP(p))
-			p->sleep_avg = JUST_INTERACTIVE_SLEEP(p) + 1;
-		else {
+		if (p->mm && p->activated != -1 &&
+			sleep_time > JUST_INTERACTIVE_SLEEP(p)){
+				p->sleep_avg = JIFFIES_TO_NS(MAX_SLEEP_AVG -
+						AVG_TIMESLICE);
+				if (!HIGH_CREDIT(p))
+					p->interactive_credit++;
+		} else {
 			/*
 			 * The lower the sleep avg a task has the more
 			 * rapidly it will rise with sleep time.
@@ -1411,12 +1424,12 @@ void scheduler_tick(int user_ticks, int 
 		 * level, which is in essence a round-robin of tasks with
 		 * equal priority.
 		 *
-		 * This only applies to user tasks in the interactive
-		 * delta range with at least MIN_TIMESLICE left.
+		 * This only applies to tasks in the interactive
+		 * delta range with at least MIN_TIMESLICE to requeue.
 		 */
-		if (p->mm && TASK_INTERACTIVE(p) && !((task_timeslice(p) -
-			p->time_slice) % TIMESLICE_GRANULARITY) &&
-			(p->time_slice > MIN_TIMESLICE) &&
+		if (TASK_INTERACTIVE(p) && !((task_timeslice(p) -
+			p->time_slice) % TIMESLICE_GRANULARITY(p)) &&
+			(p->time_slice >= (MIN_TIMESLICE * 2)) &&
 			(p->array == rq->active)) {
 
 			dequeue_task(p, rq->active);
#1 lore raw

kernel/sched.c line 132

Quoted 12 lines · Con Kolivas

Smaller timeslice granularity for most interactive tasks and larger for less interactive. Smaller for each extra cpu.

kernel/sched.c +9 -0
+#ifdef CONFIG_SMP
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * \
+		num_online_cpus())
+#else
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))))
+#endif
+

Don't you want to put a max(10,TIMESLICE_GRANULARITY) in there so that the time slice won't go below 1ms for large proc servers? I'm not sure if it was you, or someone else but they did some testing to see how the timeslice length affected the cache warmth, and the major improvements stopped after 7ms, so 10 might be a good default mimimum.

Mike

#2 lore raw
Quoted 4 lines · Mike Fedyk
Quoted 3 lines · Con Kolivas

Smaller timeslice granularity for most interactive tasks and larger for less interactive. Smaller for each extra cpu.

Quoted 15 lines

kernel/sched.c line 132

Quoted 9 lines
kernel/sched.c +9 -0
+#ifdef CONFIG_SMP
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * \
+		num_online_cpus())
+#else
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))))
+#endif
+

Don't you want to put a max(10,TIMESLICE_GRANULARITY) in there so that the time slice won't go below 1ms for large proc servers? I'm not sure if it was you, or someone else but they did some testing to see how the timeslice length affected the cache warmth, and the major improvements stopped after 7ms, so 10 might be a good default mimimum.

That works out to 10ms minimum.

Con

#3 lore raw
Quoted 21 lines · Con Kolivas
Quoted 4 lines · Mike Fedyk
Quoted 3 lines · Con Kolivas

Smaller timeslice granularity for most interactive tasks and larger for less interactive. Smaller for each extra cpu.

Quoted 15 lines

kernel/sched.c line 132

Quoted 9 lines
kernel/sched.c +9 -0
+#ifdef CONFIG_SMP
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * \
+		num_online_cpus())
+#else
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))))
+#endif
+

Don't you want to put a max(10,TIMESLICE_GRANULARITY) in there so that the time slice won't go below 1ms for large proc servers? I'm not sure if it was you, or someone else but they did some testing to see how the timeslice length affected the cache warmth, and the major improvements stopped after 7ms, so 10 might be a good default mimimum.

Quoted 1 line

That works out to 10ms minimum.

With how many processors? 64? 128?

#4 lore raw
Quoted 22 lines · Mike Fedyk
Quoted 21 lines · Con Kolivas
Quoted 19 lines · Mike Fedyk

kernel/sched.c line 132

Quoted 12 lines · Con Kolivas

Smaller timeslice granularity for most interactive tasks and larger for less interactive. Smaller for each extra cpu.

kernel/sched.c +9 -0
+#ifdef CONFIG_SMP
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * \
+		num_online_cpus())
+#else
+#define TIMESLICE_GRANULARITY(p) \
+	(MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))))
+#endif
+

Don't you want to put a max(10,TIMESLICE_GRANULARITY) in there so that the time slice won't go below 1ms for large proc servers? I'm not sure if it was you, or someone else but they did some testing to see how the timeslice length affected the cache warmth, and the major improvements stopped after 7ms, so 10 might be a good default mimimum.

Quoted 3 lines
Quoted 1 line

That works out to 10ms minimum.

With how many processors? 64? 128?

1 cpu = 10ms minimum
2 cpus = 20ms minimum
and so on.

MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * num_online_cpus())

works out to:
10 * num_online_cpus()
as the minimum

and

10 * 1024 * num_online_cpus()

as the maximum

Con

#5 lore raw
Quoted 13 lines · Con Kolivas
Quoted 1 line · Mike Fedyk

With how many processors? 64? 128?

1 cpu = 10ms minimum
2 cpus = 20ms minimum
and so on.

MIN_TIMESLICE * (1 << (MAX_BONUS - CURRENT_BONUS(p))) * num_online_cpus())

works out to:
10 * num_online_cpus()
as the minimum

Quoted 5 lines

and

10 * 1024 * num_online_cpus()

as the maximum

Ok brain fart. I thought you were deviding based on the number of CPUs... (misread the macro wrap for a "/" devide)

#6 lore raw
In reply to Con Kolivas

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Wow.. I tried 2.6.0-test4-mm4 + your 020 init patch on top .. I've noticed consiberable improvements. When I last used your scheduler patches WineX used to pauses in Warcraft3 , now no such pauses exist.. and everything seems smooth and snappy .. great work

Matt

Quoted 21 lines · Con Kolivas

D----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Fine tuning mainly.

Smaller timeslice granularity for most interactive tasks and larger for less interactive. Smaller for each extra cpu.

Smaller bounds on interactive credit.

Idle tasks can gain interactive credits; Idle tasks get more interactivity; Uninterruptible sleep wakers are not seen as idle.

Kernel threads participate in timeslice granularity requeuing.

This patch is incremental on top of O19int which is included in 2.6.0-test4-mm4. It will not apply onto mm5 which has all my stuff backed out. This patch and a full patch against 2.6.0-test4 can be found here:

http://kernel.kolivas.org/2.5

Quoted 8 lines

Con
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)

iD8DBQE/VgBaZUg7+tp6mRURAtvgAJoClT078T9wLLlEq8+pct3Yigrq3wCgja4P HjXKw3YJSey4DWpA2I+Tyi4=
=nvCB
-----END PGP SIGNATURE-----

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)

iD8DBQE/WsUUleY/n9G/oZ8RAgXcAJ43BQouqQkq1IVz6ujh1P44xnl/dACfTg4J 6KRKy+GrhNu2FC3rPSruT6M=
=fwqL
-----END PGP SIGNATURE-----