Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Apr 2017 15:29:18 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r317373 - in stable/11: etc/defaults etc/periodic/daily share/man/man5 usr.sbin/periodic
Message-ID:  <201704241529.v3OFTIt1034669@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Mon Apr 24 15:29:17 2017
New Revision: 317373
URL: https://svnweb.freebsd.org/changeset/base/317373

Log:
  MFC r316342, r316358
  
  r316342:
  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
  
  r316358:
  Fix man page typo from r316342
  
  Reported by:	rgrimes
  MFC after:	20 days
  X-MFC-With:	316342

Modified:
  stable/11/etc/defaults/periodic.conf
  stable/11/etc/periodic/daily/480.leapfile-ntpd
  stable/11/share/man/man5/periodic.conf.5
  stable/11/usr.sbin/periodic/periodic.sh
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/etc/defaults/periodic.conf
==============================================================================
--- stable/11/etc/defaults/periodic.conf	Mon Apr 24 14:56:41 2017	(r317372)
+++ stable/11/etc/defaults/periodic.conf	Mon Apr 24 15:29:17 2017	(r317373)
@@ -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: stable/11/etc/periodic/daily/480.leapfile-ntpd
==============================================================================
--- stable/11/etc/periodic/daily/480.leapfile-ntpd	Mon Apr 24 14:56:41 2017	(r317372)
+++ stable/11/etc/periodic/daily/480.leapfile-ntpd	Mon Apr 24 15:29:17 2017	(r317373)
@@ -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: stable/11/share/man/man5/periodic.conf.5
==============================================================================
--- stable/11/share/man/man5/periodic.conf.5	Mon Apr 24 14:56:41 2017	(r317372)
+++ stable/11/share/man/man5/periodic.conf.5	Mon Apr 24 15:29:17 2017	(r317373)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 26, 2015
+.Dd March 31, 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: stable/11/usr.sbin/periodic/periodic.sh
==============================================================================
--- stable/11/usr.sbin/periodic/periodic.sh	Mon Apr 24 14:56:41 2017	(r317372)
+++ stable/11/usr.sbin/periodic/periodic.sh	Mon Apr 24 15:29:17 2017	(r317373)
@@ -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



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