1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-17 10:26:15 +00:00

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
This commit is contained in:
Alan Somers 2017-04-01 04:42:35 +00:00
parent ac506a8f5a
commit 86571b9c01
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=316342
4 changed files with 29 additions and 13 deletions

View File

@ -22,6 +22,8 @@ periodic_conf_files="/etc/periodic.conf /etc/periodic.conf.local"
# 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" # Shorten output
# 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() {

View File

@ -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

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 26, 2015
.Dd March 31, 2015
.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

View File

@ -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