Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Mar 2017 22:31:54 -0700 (PDT)
From:      "Rodney W. Grimes" <freebsd@pdx.rh.CN85.dnsmgr.net>
To:        Alan Somers <asomers@freebsd.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r316342 - in head: etc/defaults etc/periodic/daily share/man/man5 usr.sbin/periodic
Message-ID:  <201704010531.v315VspK024840@pdx.rh.CN85.dnsmgr.net>
In-Reply-To: <201704010442.v314gZB5044999@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Small error in date below

> Author: asomers
> Date: Sat Apr  1 04:42:35 2017
> New Revision: 316342
> URL: https://svnweb.freebsd.org/changeset/base/316342
> 
> Log:
>   Consolidate random sleeps in periodic scripts
>   
>   Multiple periodic scripts sleep for a random amount of time in order to
>   mitigate the thundering herd problem. This is bad, because the sum of
>   multiple uniformly distributed random variables approaches a normal
>   distribution, so the problem isn't mitigated as effectively as it would be
>   with a single sleep.
>   
>   This change creates a single configurable anticongestion sleep. periodic
>   will only sleep if at least one script requires it, and it will never sleep
>   more than once per invocation. It also won't sleep if periodic was run
>   interactively, fixing an unrelated longstanding bug.
>   
>   PR:		217055
>   PR:		210188
>   Reviewed by:	cy
>   MFC after:	3 weeks
>   Differential Revision:	https://reviews.freebsd.org/D10211
> 
> Modified:
>   head/etc/defaults/periodic.conf
>   head/etc/periodic/daily/480.leapfile-ntpd
>   head/share/man/man5/periodic.conf.5
>   head/usr.sbin/periodic/periodic.sh
> 
> Modified: head/etc/defaults/periodic.conf
> ==============================================================================
> --- head/etc/defaults/periodic.conf	Sat Apr  1 01:00:36 2017	(r316341)
> +++ head/etc/defaults/periodic.conf	Sat Apr  1 04:42:35 2017	(r316342)
> @@ -22,6 +22,8 @@ periodic_conf_files="/etc/periodic.conf 
>  # periodic script dirs
>  local_periodic="/usr/local/etc/periodic"
>  
> +# Max time to sleep to avoid causing congestion on download servers
> +anticongestion_sleeptime=3600
>  
>  # Daily options
>  
> @@ -136,8 +138,6 @@ daily_status_mail_rejects_shorten="NO"		
>  
>  # 480.leapfile-ntpd
>  daily_ntpd_leapfile_enable="YES"			# Fetch NTP leapfile
> -daily_ntpd_avoid_congestion="YES"			# Avoid congesting
> -							# leapfile sources
>  
>  # 480.status-ntpd
>  daily_status_ntpd_enable="NO"				# Check NTP status
> @@ -307,6 +307,18 @@ security_status_tcpwrap_period="daily"
>  if [ -z "${source_periodic_confs_defined}" ]; then
>          source_periodic_confs_defined=yes
>  
> +	# Sleep for a random amount of time in order to mitigate the thundering
> +	# herd problem of multiple hosts running periodic simultaneously.
> +	# Will not sleep when used interactively.
> +	# Will sleep at most once per invocation of periodic
> +	anticongestion() {
> +		[ -n "$PERIODIC_IS_INTERACTIVE" ] && return
> +		if [ -f "$PERIODIC_ANTICONGESTION_FILE" ]; then
> +			rm -f $PERIODIC_ANTICONGESTION_FILE
> +			sleep `jot -r 1 0 ${anticongestion_sleeptime}`
> +		fi
> +	}
> +
>  	# Compatibility with old daily variable names.
>  	# They can be removed in stable/11.
>  	security_daily_compat_var() {
> 
> Modified: head/etc/periodic/daily/480.leapfile-ntpd
> ==============================================================================
> --- head/etc/periodic/daily/480.leapfile-ntpd	Sat Apr  1 01:00:36 2017	(r316341)
> +++ head/etc/periodic/daily/480.leapfile-ntpd	Sat Apr  1 04:42:35 2017	(r316342)
> @@ -13,16 +13,9 @@ fi
>  
>  case "$daily_ntpd_leapfile_enable" in
>      [Yy][Ee][Ss])
> -	case "$daily_ntpd_avoid_congestion" in
> -    	[Yy][Ee][Ss])
> -	    # Avoid dogpiling
> -	    (sleep $(jot -r 1 0 3600); service ntpd onefetch) &
> -	    ;;
> -	*)
> -	    service ntpd onefetch
> -	    ;;
> -	esac
> -	;;
> +        anticongestion
> +        service ntpd onefetch
> +        ;;
>  esac
>  
>  exit $rc
> 
> Modified: head/share/man/man5/periodic.conf.5
> ==============================================================================
> --- head/share/man/man5/periodic.conf.5	Sat Apr  1 01:00:36 2017	(r316341)
> +++ head/share/man/man5/periodic.conf.5	Sat Apr  1 04:42:35 2017	(r316342)
> @@ -25,7 +25,7 @@
>  .\"
>  .\" $FreeBSD$
>  .\"
> -.Dd March 26, 2015
> +.Dd March 31, 2015
                 ^^^^ 2017?


>  .Dt PERIODIC.CONF 5
>  .Os
>  .Sh NAME
> @@ -133,6 +133,10 @@ respectively.
>  Refer to the
>  .Xr periodic 8
>  manual page for how script return codes are interpreted.
> +.It Va anticongestion_sleeptime
> +.Pq Vt int
> +The maximum number of seconds to randomly sleep in order to smooth bursty loads
> +on a shared resource, such as a download mirror.
>  .El
>  .Pp
>  The following variables are used by the standard scripts that reside in
> 
> Modified: head/usr.sbin/periodic/periodic.sh
> ==============================================================================
> --- head/usr.sbin/periodic/periodic.sh	Sat Apr  1 01:00:36 2017	(r316341)
> +++ head/usr.sbin/periodic/periodic.sh	Sat Apr  1 04:42:35 2017	(r316342)
> @@ -76,6 +76,12 @@ fi
>  shift
>  arg=$1
>  
> +if [ -z "$PERIODIC_ANTICONGESTION_FILE" ] ; then
> +	export PERIODIC_ANTICONGESTION_FILE=`mktemp ${TMPDIR:-/tmp}/periodic.anticongestion.XXXXXXXXXX`
> +fi
> +if tty > /dev/null 2>&1; then
> +	export PERIODIC_IS_INTERACTIVE=1
> +fi
>  tmp_output=`mktemp ${TMPDIR:-/tmp}/periodic.XXXXXXXXXX`
>  context="$PERIODIC"
>  export PERIODIC="$arg${PERIODIC:+ }${PERIODIC}"
> @@ -141,3 +147,4 @@ esac
>  } | output_pipe $arg "$context"
>  
>  rm -f $tmp_output
> +rm -f $PERIODIC_ANTICONGESTION_FILE
> 
> 

-- 
Rod Grimes                                                 rgrimes@freebsd.org



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