git: 77e1ccbee3ed - main - rc: implement parallel boot
Cy Schubert
Cy.Schubert at cschubert.com
Wed Feb 24 02:21:29 UTC 2021
In message <202102231027.11NARYYE041280 at gitrepo.freebsd.org>, Baptiste
Daroussi
n writes:
> The branch main has been updated by bapt:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=77e1ccbee3ed6c837929e4e232fd07f9
> 5bfc8294
>
> commit 77e1ccbee3ed6c837929e4e232fd07f95bfc8294
> Author: Rick Parrish <unitrunker at gmail.com>
> AuthorDate: 2021-02-07 06:15:21 +0000
> Commit: Baptiste Daroussin <bapt at FreeBSD.org>
> CommitDate: 2021-02-23 10:16:53 +0000
>
> rc: implement parallel boot
>
> take advantage of the rcorder -p argument to implement parallel
> booting in rc.
>
> According to the author non scientific tests:
> on a Core 2 Duo with spinning disk:
>
> | Services enabled | before | after | saving |
> | 0 | 8s | 8s | 0 |
> | 1 | 13s | 13s | 0 |
> | 2 | 17s | 13s | 5 |
> | 3 | 23s | 13s | 10 |
> | 4 | 28s | 13s | 15 |
> | 5 | 33s | 13s | 20 |
>
> PR: 249192
> MFC after: 3 weeks
> ---
> libexec/rc/rc | 49 ++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 34 insertions(+), 15 deletions(-)
>
> diff --git a/libexec/rc/rc b/libexec/rc/rc
> index 35db4a850516..722d7fe35884 100644
> --- a/libexec/rc/rc
> +++ b/libexec/rc/rc
> @@ -91,19 +91,31 @@ if ! [ -e ${firstboot_sentinel} ]; then
> skip_firstboot="-s firstboot"
> fi
>
> +# rc_parallel_start default is "NO"
> +rc_parallel_start=${rc_parallel_start:-NO}
> +_rc_parallel=''
> +# enable rcorder -p if /etc/rc.conf rc_parallel_start is "YES"
> +checkyesno rc_parallel_start && _rc_parallel='-p'
> +
> # Do a first pass to get everything up to $early_late_divider so that
> # we can do a second pass that includes $local_startup directories
> #
> -files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* 2>/dev/null`
> +files=`rcorder ${skip} ${skip_firstboot} ${_rc_parallel} /etc/rc.d/* 2>/dev/
> null`
>
> _rc_elem_done=' '
> -for _rc_elem in ${files}; do
> - run_rc_script ${_rc_elem} ${_boot}
> - _rc_elem_done="${_rc_elem_done}${_rc_elem} "
> -
> - case "$_rc_elem" in
> - */${early_late_divider}) break ;;
> - esac
> +IFS=$'\n'
> +for _rc_group in ${files}; do
> + IFS=$' '
> + for _rc_elem in ${_rc_group}; do
> + run_rc_script ${_rc_elem} ${_boot} &
> + _rc_elem_done="${_rc_elem_done}${_rc_elem} "
> +
> + case "$_rc_elem" in
> + */${early_late_divider}) break ;;
> + esac
> + done
> + wait
> + IFS=$'\n'
> done
>
> unset files local_rc
> @@ -122,14 +134,21 @@ if [ -e ${firstboot_sentinel} ]; then
> skip_firstboot=""
> fi
>
> -files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} 2>/dev/null
> `
> -for _rc_elem in ${files}; do
> - case "$_rc_elem_done" in
> - *" $_rc_elem "*) continue ;;
> - esac
> -
> - run_rc_script ${_rc_elem} ${_boot}
> +files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} ${_rc_paral
> lel} 2>/dev/null`
> +IFS=$'\n'
> +for _rc_group in ${files}; do
> + IFS=$' '
> + for _rc_elem in ${_rc_group}; do
> + case "$_rc_elem_done" in
> + *" $_rc_elem "*) continue ;;
> + esac
> +
> + run_rc_script ${_rc_elem} ${_boot} &
> + done
> + wait
> + IFS=$'\n'
> done
> +unset IFS
>
> # Remove the firstboot sentinel, and reboot if it was requested.
> # Be a bit paranoid about removing it to handle the common failure
>
Since this commit my postfix, dovecot and nut fail to start at boot, and
must be started by hand.
--
Cheers,
Cy Schubert <Cy.Schubert at cschubert.com>
FreeBSD UNIX: <cy at FreeBSD.org> Web: https://FreeBSD.org
NTP: <cy at nwtime.org> Web: https://nwtime.org
The need of the many outweighs the greed of the few.
More information about the dev-commits-src-all
mailing list