Subject: Re: Proposed rc.d changes....
To: Greywolf <greywolf@starwolf.com>
From: Luke Mewburn <lukem@wasabisystems.com>
List: tech-userlevel
Date: 02/26/2001 10:51:34
On Sat, Feb 24, 2001 at 11:25:34AM -0800, Greywolf wrote:
> 'kay, I've tested this out; even on the SS5/170 I have, the difference is
> noticeable between the a) and b) below; the difference between b) and c) is
> measurable but not by as much, but it's still there.
> 
> I like it.

So, loading rc.conf once and other little optimisations help a lot?  Good!
The rc_fast_and_loose stuff might only help on platforms where fork()
is really bad.

Can you give me some indicative numbers of the boot times of options
a), b) and c)? 



> 
> On Fri, 23 Feb 2001, Luke Mewburn wrote:
> 
> # From: Luke Mewburn <lukem@wasabisystems.com>
> # To: tech-userlevel@netbsd.org
> # Cc: Greywolf <greywolf@starwolf.com>
> # Subject: Re: Proposed rc.d changes....
> #
> # On Tue, Feb 20, 2001 at 07:12:48PM +1100, Luke Mewburn wrote:
> # > On Tue, Feb 20, 2001 at 02:36:04PM +1100, Luke Mewburn wrote:
> # > > I've been meaning to ask for testing from users with much slower
> # > > machines than my laptop (a PIII-700), because I didn't notice any
> # > > difference with my laptop with the patch.
> # > >
> # > > Any takers? (Or should I just post it here and have people post their
> # > > before & after results? :)
> # >
> # > here's a work in progress. use at your own risk, etc ...
> # >
> # > i'd be interested in the difference between:
> # >
> # > 	(a) the system as it stands now.
> # >
> # > 	(b) the following patch without rc_fast_and_loose set
> # > 	    (it only loads rc.conf once, and has other speedups)
> # >
> # > 	(c) the following patch WITH rc_fast_and_loose set.
> # >
> # > the patch adds a call to `date' at the start of /etc/rc, so that could
> # > be added to your /etc/rc before test (a) so you have an idea on when
> # > it starts (date is already run at the end).
> #
> # So, I posted the patches a couple of days ago, and I haven't received
> # any feedback yet.
> #
> # Does it take *that* long to reboot the slow boxen?
> #
> #
> # Luke.
> #
> # >
> # > enjoy,
> # > luke.
> # >
> # > Index: rc
> # > ===================================================================
> # > RCS file: /cvsroot/basesrc/etc/rc,v
> # > retrieving revision 1.154
> # > diff -p -r1.154 rc
> # > *** rc	2000/12/15 00:00:09	1.154
> # > --- rc	2001/02/20 08:06:28
> # > *************** export PATH=/sbin:/bin:/usr/sbin:/usr/bi
> # > *** 14,20 ****
> # > --- 14,29 ----
> # >
> # >   . /etc/rc.subr
> # >   . /etc/rc.conf
> # > + _rc_conf_loaded=YES
> # >
> # > + #	Uncomment the following to execute each /etc/rc.d script in
> # > + #	the current shell rather than in a subshell.  This may be
> # > + #	faster on slow machines.
> # > + #	CAUTION: USE THIS AT YOUR OWN RISK; A BAD SCRIPT MAY
> # > + #	INADVERTENTLY PREVENT BOOT TO MULTIUSER.
> # > + #
> # > + #rc_fast_and_loose=YES
> # > +
> # >   if ! checkyesno rc_configured; then
> # >   	echo "/etc/rc.conf is not configured.  Multiuser boot aborted."
> # >   	exit 1
> # > *************** trap : 2
> # > *** 34,42 ****
> # >   trap "echo 'Boot interrupted.'; exit 1" 3
> # >
> # >   files=`rcorder -s nostart /etc/rc.d/*`
> # >
> # > ! for i in $files; do
> # > ! 	run_rc_script $i start
> # >   done
> # >
> # >   date
> # > --- 43,53 ----
> # >   trap "echo 'Boot interrupted.'; exit 1" 3
> # >
> # >   files=`rcorder -s nostart /etc/rc.d/*`
> # > +
> # > + date
> # >
> # > ! for _rc_elem in $files; do
> # > ! 	run_rc_script $_rc_elem start
> # >   done
> # >
> # >   date
> # > Index: rc.subr
> # > ===================================================================
> # > RCS file: /cvsroot/basesrc/etc/rc.subr,v
> # > retrieving revision 1.29
> # > diff -p -r1.29 rc.subr
> # > *** rc.subr	2000/11/17 03:47:43	1.29
> # > --- rc.subr	2001/02/20 08:06:29
> # > *************** check_pidfile()
> # > *** 117,132 ****
> # >   	fi
> # >   	_procnamebn=${_procname##*/}
> # >   	ps -p $_pid -o 'pid,command' | while read _npid _arg0 _argv; do
> # > ! 		if [ "$_npid" = "PID" ]; then
> # > ! 			continue
> # > ! 		fi
> # > ! 		if [   "$_arg0" = "$_procname" \
> # > ! 		    -o "$_arg0" = "$_procnamebn" \
> # > ! 		    -o "$_arg0" = "${_procnamebn}:" \
> # > ! 		    -o "$_arg0" = "(${_procnamebn})" ]; then
> # >   			echo $_npid
> # >   			return
> # > ! 		fi
> # >   	done
> # >   }
> # >
> # > --- 117,132 ----
> # >   	fi
> # >   	_procnamebn=${_procname##*/}
> # >   	ps -p $_pid -o 'pid,command' | while read _npid _arg0 _argv; do
> # > ! 		case "$_npid" in
> # > ! 		    PID)
> # > ! 			continue ;;
> # > ! 		esac
> # > ! 		case "$_arg0" in
> # > ! 		    $_procname|$_procnamebn|${_procnamebn}:|"(${_procnamebn})")
> # >   			echo $_npid
> # >   			return
> # > ! 			;;
> # > ! 		esac
> # >   	done
> # >   }
> # >
> # > *************** check_process()
> # > *** 144,159 ****
> # >   	_procnamebn=${_procname##*/}
> # >   	_pref=
> # >   	ps -ax -o 'pid,command' | while read _npid _arg0 _argv; do
> # > ! 		if [ "$_npid" = "PID" ]; then
> # > ! 			continue
> # > ! 		fi
> # > ! 		if [   "$_arg0" = "$_procname" \
> # > ! 		    -o "$_arg0" = "$_procnamebn" \
> # > ! 		    -o "$_arg0" = "${_procnamebn}:" \
> # > ! 		    -o "$_arg0" = "(${_procnamebn})" ]; then
> # >   			echo -n "$_pref$_npid"
> # >   			_pref=" "
> # > ! 		fi
> # >   	done
> # >   }
> # >
> # > --- 144,159 ----
> # >   	_procnamebn=${_procname##*/}
> # >   	_pref=
> # >   	ps -ax -o 'pid,command' | while read _npid _arg0 _argv; do
> # > ! 		case "$_npid" in
> # > ! 		    PID)
> # > ! 			continue ;;
> # > ! 		esac
> # > ! 		case "$_arg0" in
> # > ! 		    $_procname|$_procnamebn|${_procnamebn}:|"(${_procnamebn})")
> # >   			echo -n "$_pref$_npid"
> # >   			_pref=" "
> # > ! 			;;
> # > ! 		esac
> # >   	done
> # >   }
> # >
> # > *************** run_rc_command()
> # > *** 256,262 ****
> # >   {
> # >   	_arg=$1
> # >   	if [ -z "$name" ]; then
> # > ! 		err 3 '$name is not set.'
> # >   	fi
> # >
> # >   	case "$_arg" in
> # > --- 256,262 ----
> # >   {
> # >   	_arg=$1
> # >   	if [ -z "$name" ]; then
> # > ! 		err 3 'run_rc_command: $name is not set.'
> # >   	fi
> # >
> # >   	case "$_arg" in
> # > *************** run_rc_command()
> # > *** 297,314 ****
> # >   	else
> # >   		eval _flags=\$${name}_flags
> # >   	fi
> # > ! 	eval _chdir=\$${name}_chdir
> # > ! 	eval _chroot=\$${name}_chroot
> # > ! 	eval _nice=\$${name}_nice
> # > ! 	eval _user=\$${name}_user
> # > ! 	eval _group=\$${name}_group
> # > ! 	eval _groups=\$${name}_groups
> # >
> # >   					# if ${rcvar} is set, and $1 is not
> # >   					# "rcvar" or "status", then run
> # >   					#	checkyesno ${rcvar}
> # >   					# and return if that failed
> # >   					#
> # >   	if [ -n "${rcvar}" -a "$_arg" != "rcvar" -a "$_arg" != "status" ]; then
> # >   		if ! checkyesno ${rcvar}; then
> # >   			return 0
> # > --- 297,312 ----
> # >   	else
> # >   		eval _flags=\$${name}_flags
> # >   	fi
> # > ! 	eval _chdir=\$${name}_chdir	_chroot=\$${name}_chroot \
> # > ! 	    _nice=\$${name}_nice	_user=\$${name}_user \
> # > ! 	    _group=\$${name}_group	_groups=\$${name}_groups
> # >
> # >   					# if ${rcvar} is set, and $1 is not
> # >   					# "rcvar" or "status", then run
> # >   					#	checkyesno ${rcvar}
> # >   					# and return if that failed
> # >   					#
> # > + 	# XXXX use case?
> # >   	if [ -n "${rcvar}" -a "$_arg" != "rcvar" -a "$_arg" != "status" ]; then
> # >   		if ! checkyesno ${rcvar}; then
> # >   			return 0
> # > *************** run_rc_command()
> # > *** 325,332 ****
> # >   					# if there's a custom ${XXX_cmd},
> # >   					# run that instead of the default
> # >   					#
> # > ! 		eval _cmd=\$${_arg}_cmd
> # > ! 		eval _precmd=\$${_arg}_precmd
> # >   		if [ -n "$_cmd" ]; then
> # >   					# if the precmd failed and force
> # >   					# isn't set, exit
> # > --- 323,329 ----
> # >   					# if there's a custom ${XXX_cmd},
> # >   					# run that instead of the default
> # >   					#
> # > ! 		eval _cmd=\$${_arg}_cmd _precmd=\$${_arg}_precmd
> # >   		if [ -n "$_cmd" ]; then
> # >   					# if the precmd failed and force
> # >   					# isn't set, exit
> # > *************** run_rc_script()
> # > *** 515,528 ****
> # >   		err 3 'USAGE: run_rc_script file arg'
> # >   	fi
> # >
> # > ! 	case "$_file" in
> # > ! 	*.sh)				# run in current shell
> # >   		set $_arg ; . $_file
> # > ! 		;;
> # > ! 	*)				# run in subshell
> # > ! 		( set $_arg ; . $_file )
> # > ! 		;;
> # > ! 	esac
> # >   }
> # >
> # >   #
> # > --- 512,532 ----
> # >   		err 3 'USAGE: run_rc_script file arg'
> # >   	fi
> # >
> # > ! 	if [ -n "$rc_fast_and_loose" ]; then
> # > ! 		unset name command command_args extra_commands pidfile rcvar
> # > ! 		unset required_dirs required_files required_vars
> # > ! 		eval unset ${_arg}_cmd ${_arg}_precmd
> # >   		set $_arg ; . $_file
> # > ! 	else
> # > ! 		case "$_file" in
> # > ! 		*.sh)				# run in current shell
> # > ! 			set $_arg ; . $_file
> # > ! 			;;
> # > ! 		*)				# run in subshell
> # > ! 			( set $_arg ; . $_file )
> # > ! 			;;
> # > ! 		esac
> # > ! 	fi
> # >   }
> # >
> # >   #
> # > *************** load_rc_config()
> # > *** 536,542 ****
> # >   		err 3 'USAGE: load_rc_config command'
> # >   	fi
> # >
> # > ! 	. /etc/rc.conf
> # >   	if [ -f /etc/rc.conf.d/"$_command" ]; then
> # >   		. /etc/rc.conf.d/"$_command"
> # >   	fi
> # > --- 540,549 ----
> # >   		err 3 'USAGE: load_rc_config command'
> # >   	fi
> # >
> # > ! 	if [ -z "$_rc_conf_loaded" ]; then
> # > ! 		. /etc/rc.conf
> # > ! 		_rc_conf_loaded=YES
> # > ! 	fi
> # >   	if [ -f /etc/rc.conf.d/"$_command" ]; then
> # >   		. /etc/rc.conf.d/"$_command"
> # >   	fi
> #
> # --
> # Luke Mewburn  <lukem@wasabisystems.com>  http://www.wasabisystems.com
> # Luke Mewburn     <lukem@netbsd.org>      http://www.netbsd.org
> # Wasabi Systems - providing NetBSD sales, support and service.
> #
> 
> 
> 				--*greywolf;
> --
> *BSD:  For IQs higher than 120.

-- 
Luke Mewburn  <lukem@wasabisystems.com>  http://www.wasabisystems.com
Luke Mewburn     <lukem@netbsd.org>      http://www.netbsd.org
Wasabi Systems - providing NetBSD sales, support and service.