Re: Machine Freezes while Running Crossover Office

Ingo Molnar
2005-05-31T18:53:35Z

* Linus Torvalds <torvalds@osdl.org> wrote:

> Ingo, any ideas? This is bothersome, because it could hit any number
> of people, and we'd never have realized because it's not usually
> repeatable and not usually quite that extreme. [...]

it's the fundamental unfairness of the interactivity code (or any
interactivity code that plays favorites between tasks), and the larger
pipe buffers made this more common it seems. It's quite dangerous to
tune the scheduler so close to 2.6.12, but the issue seems serious
enough. I think we could try to change INTERACTIVE_DELTA from 2 to 3 (or
even 4) instead of turning off the back-into-the-active-array logic
altogether.

Pekka, i've attached a quick hack that turns INTERACTIVE_DELTA into a
runtime tunable. It defaults to the stock value of 2, but a value of '5'
should be equivalent to the other patch you tried (but is less hacky).

Now, assuming you can confirm that doing:

echo 5 > /proc/sys/kernel/INTERACTIVE_DELTA

fixes the problem (all other things should be back to the default, i.e.
no renicing of anything), then it would be interesting to find the
minimum value where the problem goes away. I.e. we know that 2 is bad,
but how bad are values 3 and 4?

Ingo

--- linux/kernel/sched.c.orig
+++ linux/kernel/sched.c
@@ -90,7 +90,7 @@
#define EXIT_WEIGHT 3
#define PRIO_BONUS_RATIO 25
#define MAX_BONUS (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100)
-#define INTERACTIVE_DELTA 2
+int INTERACTIVE_DELTA = 2;
#define MAX_SLEEP_AVG (DEF_TIMESLICE * MAX_BONUS)
#define STARVATION_LIMIT (MAX_SLEEP_AVG)
#define NS_MAX_SLEEP_AVG (JIFFIES_TO_NS(MAX_SLEEP_AVG))
--- linux/kernel/sysctl.c.orig
+++ linux/kernel/sysctl.c
@@ -51,6 +51,8 @@

#if defined(CONFIG_SYSCTL)

+extern int INTERACTIVE_DELTA;
+
/* External variables not in a header file. */
extern int C_A_D;
extern int sysctl_overcommit_memory;
@@ -275,6 +277,14 @@ static ctl_table kern_table[] = {
.proc_handler = &proc_dointvec,
},
{
+ .ctl_name = KERN_PANIC,
+ .procname = "INTERACTIVE_DELTA",
+ .data = &INTERACTIVE_DELTA,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = &proc_dointvec,
+ },
+ {
.ctl_name = KERN_CORE_USES_PID,
.procname = "core_uses_pid",
.data = &core_uses_pid,