[PATCH] 2.3.41-pre2 - run-time tunable scheduler

James Manning jmm en raleigh.ibm.com
Lun Ene 24 04:58:14 CST 2000


This patch creates /proc/sys/kernel/proc_change_penalty and
/proc/sys/kernel/tlb_flush_penalty as discussed before.

It's a first-pass it-compiles patch.  The patch itself is pretty simple
so I can't imagine any real issues with it, but I haven't slept in a
couple of days so I wouldn't be surprised if a few braino's slipped in.

For anyone and everyone that would like to penalize process migration
more or less or want to tune the heuristic for TLB flush penalty, give
it a shot and see if you can produce some good numbers, esp. ones that
show a nice maximum point (and note your hardware :)  Getting some better
default numbers for these two values, as Andrea correctly points out,
is something that should be around for 2.4.0

James
-- 
Miscellaneous Engineer --- IBM Netfinity Performance Development
------------ próxima parte ------------
diff -ur linux-sched/include/asm-alpha/smp.h linux-2.3.40/include/asm-alpha/smp.h
--- linux-sched/include/asm-alpha/smp.h	Sat Jan  8 16:13:12 2000
+++ linux-2.3.40/include/asm-alpha/smp.h	Sun Jan 23 19:39:30 2000
@@ -38,8 +38,6 @@
 
 extern struct cpuinfo_alpha cpu_data[NR_CPUS];
 
-#define PROC_CHANGE_PENALTY     20
-
 /* Map from cpu id to sequential logical cpu number.  This will only
    not be idempotent when cpus failed to come on-line.  */
 extern int cpu_number_map[NR_CPUS];
diff -ur linux-sched/include/asm-i386/smp.h linux-2.3.40/include/asm-i386/smp.h
--- linux-sched/include/asm-i386/smp.h	Sun Jan 23 17:44:30 2000
+++ linux-2.3.40/include/asm-i386/smp.h	Sun Jan 23 19:48:30 2000
@@ -95,7 +95,5 @@
  *	processes are run.
  */
  
-#define PROC_CHANGE_PENALTY	15		/* Schedule penalty */
-
 #endif
 #endif
diff -ur linux-sched/include/asm-ppc/smp.h linux-2.3.40/include/asm-ppc/smp.h
--- linux-sched/include/asm-ppc/smp.h	Mon Dec 20 17:27:34 1999
+++ linux-2.3.40/include/asm-ppc/smp.h	Sun Jan 23 19:39:52 2000
@@ -29,7 +29,6 @@
 void smp_send_tlb_invalidate(int);
 
 #define NO_PROC_ID		0xFF            /* No processor magic marker */
-#define PROC_CHANGE_PENALTY	20
 
 /* 1 to 1 mapping on PPC -- Cort */
 #define cpu_logical_map(cpu) (cpu)
diff -ur linux-sched/include/asm-sparc/smp.h linux-2.3.40/include/asm-sparc/smp.h
--- linux-sched/include/asm-sparc/smp.h	Sun Jan 23 04:34:05 2000
+++ linux-2.3.40/include/asm-sparc/smp.h	Sun Jan 23 19:40:01 2000
@@ -181,8 +181,6 @@
 #define MBOX_IDLECPU2         0xFD
 #define MBOX_STOPCPU2         0xFE
 
-#define PROC_CHANGE_PENALTY     15
-
 #endif /* !(__SMP__) */
 
 #define NO_PROC_ID            0xFF
diff -ur linux-sched/include/asm-sparc64/smp.h linux-2.3.40/include/asm-sparc64/smp.h
--- linux-sched/include/asm-sparc64/smp.h	Sun Jan 23 04:34:05 2000
+++ linux-2.3.40/include/asm-sparc64/smp.h	Sun Jan 23 19:40:08 2000
@@ -121,8 +121,6 @@
 
 #endif /* !(__ASSEMBLY__) */
 
-#define PROC_CHANGE_PENALTY	20
-
 #endif /* !(__SMP__) */
 
 #define NO_PROC_ID		0xFF
diff -ur linux-sched/include/linux/sysctl.h linux-2.3.40/include/linux/sysctl.h
--- linux-sched/include/linux/sysctl.h	Sun Jan 23 04:34:05 2000
+++ linux-2.3.40/include/linux/sysctl.h	Sun Jan 23 19:46:38 2000
@@ -110,7 +110,9 @@
  	KERN_SPARC_STOP_A=44,	/* int: Sparc Stop-A enable */
  	KERN_SHMMNI=45,		/* int: shm array identifiers */
 	KERN_OVERFLOWUID=46,	/* int: overflow UID */
-	KERN_OVERFLOWGID=47	/* int: overflow GID */
+	KERN_OVERFLOWGID=47,	/* int: overflow GID */
+	KERN_PROC_CHANGE=48,	/* int: processor change penalty */
+	KERN_TLB_FLUSH=49	/* int: TLB flush penalty */
 };
 
 
Only in linux-2.3.40/kernel: .printk.c.swp
diff -ur linux-sched/kernel/sched.c linux-2.3.40/kernel/sched.c
--- linux-sched/kernel/sched.c	Thu Jan 20 12:51:42 2000
+++ linux-2.3.40/kernel/sched.c	Sun Jan 23 19:43:11 2000
@@ -10,6 +10,8 @@
  *  1998-11-19	Implemented schedule_timeout() and related stuff
  *		by Andrea Arcangeli
  *  1998-12-28  Implemented better SMP scheduling by Ingo Molnar
+ *  2000-01-23  Put CPU change and TLB flush penalties in /proc
+ *		by James Manning
  */
 
 /*
@@ -35,9 +37,17 @@
 
 /*
  * scheduler variables
+ *
+ * Note: with so much SMP variance across the i386 arch alone, it made
+ *       more sense (and less lines of code) to go ahead and consolidate.
  */
 
+#define DEFAULT_PROC_CHANGE_PENALTY 25
+#define DEFAULT_TLB_FLUSH_PENALTY 5
+
 unsigned securebits = SECUREBITS_DEFAULT; /* systemwide security settings */
+int sysctl_proc_change_penalty = DEFAULT_PROC_CHANGE_PENALTY; /* tuning */
+int sysctl_tlb_flush_penalty = DEFAULT_TLB_FLUSH_PENALTY;
 
 extern void mem_use(void);
 
@@ -137,12 +147,12 @@
 	/* Give a largish advantage to the same processor...   */
 	/* (this is equivalent to penalizing other processors) */
 	if (p->processor == this_cpu)
-		weight += PROC_CHANGE_PENALTY;
+		weight += sysctl_proc_change_penalty;
 #endif
 
 	/* .. and a slight advantage to the current MM */
 	if (p->mm == this_mm)
-		weight += 1;
+		weight += sysctl_tlb_flush_penalty;
 	weight += p->priority;
 
 out:
diff -ur linux-sched/kernel/sysctl.c linux-2.3.40/kernel/sysctl.c
--- linux-sched/kernel/sysctl.c	Sun Jan 16 01:08:28 2000
+++ linux-2.3.40/kernel/sysctl.c	Sun Jan 23 19:47:13 2000
@@ -37,6 +37,7 @@
 
 /* External variables not in a header file. */
 extern int panic_timeout;
+extern int sysctl_proc_change_penalty, sysctl_tlb_flush_penalty;
 extern int console_loglevel, C_A_D;
 extern int bdf_prm[], bdflush_min[], bdflush_max[];
 extern int sysctl_overcommit_memory;
@@ -253,6 +254,10 @@
 	{KERN_OVERFLOWGID, "overflowgid", &overflowgid, sizeof(int), 0644, NULL,
 	 &proc_dointvec_minmax, &sysctl_intvec, NULL,
 	 &minolduid, &maxolduid},
+	{KERN_PROC_CHANGE, "proc_change_penalty", &sysctl_proc_change_penalty, 
+         sizeof(int), 0644, NULL, &proc_dointvec},
+	{KERN_TLB_FLUSH, "tlb_flush_penalty", &sysctl_tlb_flush_penalty, 
+         sizeof(int), 0644, NULL, &proc_dointvec},
 	{0}
 };
 


Más información sobre la lista de distribución Ayuda