Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Nov 1999 04:12:15 -0800 (PST)
From:      Bruce Evans <bde@FreeBSD.org>
To:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/kern kern_exit.c kern_synch.c src/sys/sys proc.h
Message-ID:  <199911281212.EAA64917@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
bde         1999/11/28 04:12:15 PST

  Modified files:
    sys/kern             kern_exit.c kern_synch.c 
    sys/sys              proc.h 
  Log:
  Scheduler fixes equivalent to the ones logged in the following NetBSD
  commit to kern_synch.c:
  
  ----------------------------
  revision 1.55
  date: 1999/02/23 02:56:03;  author: ross;  state: Exp;  lines: +39 -10
  Scheduler bug fixes and reorganization
  * fix the ancient nice(1) bug, where nice +20 processes incorrectly
    steal 10 - 20% of the CPU, (or even more depending on load average)
  * provide a new schedclk() mechanism at a new clock at schedhz, so high
    platform hz values don't cause nice +0 processes to look like they are
    niced
  * change the algorithm slightly, and reorganize the code a lot
  * fix percent-CPU calculation bugs, and eliminate some no-op code
  
  === nice bug === Correctly divide the scheduler queues between niced and
  compute-bound processes. The current nice weight of two (sort of, see
  `algorithm change' below) neatly divides the USRPRI queues in half; this
  should have been used to clip p_estcpu, instead of UCHAR_MAX.  Besides
  being the wrong amount, clipping an unsigned char to UCHAR_MAX is a no-op,
  and it was done after decay_cpu() which can only _reduce_ the value.  It
  has to be kept <= NICE_WEIGHT * PRIO_MAX - PPQ or processes can
  scheduler-penalize themselves onto the same queue as nice +20 processes.
  (Or even a higher one.)
  
  === New schedclk() mechansism === Some platforms should be cutting down
  stathz before hitting the scheduler, since the scheduler algorithm only
  works right in the vicinity of 64 Hz. Rather than prescale hz, then scale
  back and forth by 4 every time p_estcpu is touched (each occurance an
  abstraction violation), use p_estcpu without scaling and require schedhz
  to be generated directly at the right frequency. Use a default stathz (well,
  actually, profhz) / 4, so nothing changes unless a platform defines schedhz
  and a new clock.  Define these for alpha, where hz==1024, and nice was
  totally broke.
  
  === Algorithm change === The nice value used to be added to the
  exponentially-decayed scheduler history value p_estcpu, in _addition_ to
  be incorporated directly (with greater wieght) into the priority calculation.
  At first glance, it appears to be a pointless increase of 1/8 the nice
  effect (pri = p_estcpu/4 + nice*2), but it's actually at least 3x that
  because it will ramp up linearly but be decayed only exponentially, thus
  converging to an additional .75 nice for a loadaverage of one. I killed
  this, it makes the behavior hard to control, almost impossible to analyze,
  and the effect (~~nothing at for the first second, then somewhat increased
  niceness after three seconds or more, depending on load average) pointless.
  
  === Other bugs === hz -> profhz in the p_pctcpu = f(p_cpticks) calcuation.
  Collect scheduler functionality. Try to put each abstraction in just one
  place.
  ----------------------------
  
  The details are a little different in FreeBSD:
  
  === nice bug ===   Fixing this is the main point of this commit.  We use
  essentially the same clipping rule as NetBSD (our limit on p_estcpu
  differs by a scale factor).  However, clipping at all is fundamentally
  bad.  It gives free CPU the hoggiest hogs once they reach the limit, and
  reaching the limit is normal for long-running hogs.  This will be fixed
  later.
  
  === New schedclk() mechanism ===  We don't use the NetBSD schedclk()
  (now schedclock()) mechanism.  We require (real)stathz to be about 128
  and scale by an extra factor of 2 compared with NetBSD's statclock().
  We scale p_estcpu instead of scaling the clock.  This is more accurate
  and flexible.
  
  === Algorithm change ===  Same change.
  
  === Other bugs ===  The p_pctcpu bug was fixed long ago.  We don't try as
  hard to abstract functionality yet.
  
  Related changes: the new limit on p_estcpu must be exported to kern_exit.c
  for clipping in wait1().
  
  Agreed with by:		dufault
  
  Revision  Changes    Path
  1.91      +39 -10    src/sys/kern/kern_exit.c
  1.83      +39 -10    src/sys/kern/kern_synch.c
  1.95      +39 -10    src/sys/sys/proc.h



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911281212.EAA64917>