O20int
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:
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);
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
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
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?
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
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)
-----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: SHA1Fine 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:
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-----