Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Aug 2011 14:21:38 +0200
From:      joris dedieu <joris.dedieu@gmail.com>
To:        freebsd-hackers@freebsd.org, freebsd-rc@freebsd.org
Subject:   Re: Concurrent execution of rc-scripts with rcorder(8)
Message-ID:  <CAPd55qC_dVy=SNoi%2Bwn1qXo=nQ54yk2yiVpk-xzKtvZqW3Kbkg@mail.gmail.com>
In-Reply-To: <CAL409Kxum=-oyPFCwpAgA_bcTAuAUjQRB0FNmwGLKWFBDAEP8A@mail.gmail.com>
References:  <20110821121509.GA27730@crane.none> <CAL409Kxum=-oyPFCwpAgA_bcTAuAUjQRB0FNmwGLKWFBDAEP8A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
2011/8/24 Vitaly Magerya <vmagerya@gmail.com>:
>> the idea to start services concurrently during boot isn't new and the
>> question why FreeBSD doesn't do it has popped up on the forum and
>> mailing list occasionally. So, why not give it a shot?
>
> As someone who uses FreeBSD on hist laptop and is constantly annoyed
> by the lack of suspend-to-disk, every second trimmed of from boot
> time is a win.
>
> In line of the recent FreeBSD problems & solutions discussion, would
> any commiter take time to review and commit this? "FreeBSD 9.1
> introduces concurrent startup, improves boot speed" is the kind of
> buzz we're after.
>
>> Any ideas and feedback are very welcome!
>
> One thing to try is to attach a diagnostics feature that will produce
> data about rc script dependencies and execution times, which can
> be used to visualize which scripts take most time, and how to
> reorganize dependencies to improve boot time (one example I noticed
> is moused: it is only started after network is up, which is a shame,
> since it could easily start while DHCP negotiation is in progress).

Perhaps   background_dhclient="YES" should solve it ? I think
background approach (which is current archlinux one [1] ) is not so
bad. It's clearly  less powerful than automagic parallelization  but
it's maybe less invasive and more flexible for sysadmins.

I gave it a try with a little patch for rc.subr that introduces a
background keyword  (eg: moused_enable="background"). It's surly buggy
with some variables like rc_quiet. I have to check more.

[1] https://wiki.archlinux.org/index.php/DAEMONS

Joris

> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
>

[-- Attachment #2 --]
--- /etc/rc.subr	2011-05-02 08:49:11.000000000 +0200
+++ rc.subr	2011-08-25 13:50:29.300275783 +0200
@@ -142,8 +142,9 @@
 	debug "checkyesno: $1 is set to $_value."
 	case $_value in
 
-		#	"yes", "true", "on", or "1"
-	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
+		#	"yes", "true", "on", "1", "bg" or "background"
+	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1|[Bb][Gg]|\
+[Bb][Aa][Cc][Kk][Gg][Rr][Oo][Uu][Nn][Dd])
 		return 0
 		;;
 
@@ -159,6 +160,25 @@
 }
 
 #
+# checkbg var
+#	Test $1 variable, and return 0 if it's background or bg.
+#	Return nonzero otherwise.
+#
+checkbg()
+{
+	eval _value=\$${1}
+	debug "checkbg: $1 is set to $_value."
+	case $_value in
+	[Bb][Gg]|[Bb][Aa][Cc][Kk][Gg][Rr][Oo][Uu][Nn][Dd])
+		return 0
+		;;
+	*)
+		return 1
+		;;
+	esac
+}
+
+#
 # reverse_list list
 #	print the list in reverse order
 #
@@ -735,54 +755,11 @@
 			;;
 
 		start)
-			if [ -z "$rc_fast" -a -n "$rc_pid" ]; then
-				echo 1>&2 "${name} already running? (pid=$rc_pid)."
-				return 1
+			if checkbg ${rcvar}; then
+				eval _run_rc_start &
+			else 
+				_run_rc_start
 			fi
-
-			if [ ! -x ${_chroot}${_chroot:+"/"}${command} ]; then
-				warn "run_rc_command: cannot run $command"
-				return 1
-			fi
-
-			if ! _run_rc_precmd; then
-				warn "failed precmd routine for ${name}"
-				return 1
-			fi
-
-					# setup the full command to run
-					#
-			check_startmsgs && echo "Starting ${name}."
-			if [ -n "$_chroot" ]; then
-				_doit="\
-${_nice:+nice -n $_nice }\
-chroot ${_user:+-u $_user }${_group:+-g $_group }${_groups:+-G $_groups }\
-$_chroot $command $rc_flags $command_args"
-			else
-				_doit="\
-${_chdir:+cd $_chdir && }\
-$command $rc_flags $command_args"
-				if [ -n "$_user" ]; then
-				    _doit="su -m $_user -c 'sh -c \"$_doit\"'"
-				fi
-				if [ -n "$_nice" ]; then
-					if [ -z "$_user" ]; then
-						_doit="sh -c \"$_doit\""
-					fi
-					_doit="nice -n $_nice $_doit"
-				fi
-			fi
-
-					# run the full command
-					#
-			if ! _run_rc_doit "$_doit"; then
-				warn "failed to start ${name}"
-				return 1
-			fi
-
-					# finally, run postcmd
-					#
-			_run_rc_postcmd
 			;;
 
 		stop)
@@ -985,6 +962,59 @@
 	echo "$_cmd"
 }
 
+_run_rc_start()
+{
+	if [ -z "$rc_fast" -a -n "$rc_pid" ]; then
+		echo 1>&2 "${name} already running? (pid=$rc_pid)."
+		return 1
+	fi
+
+	if [ ! -x ${_chroot}${_chroot:+"/"}${command} ]; then
+		warn "run_rc_command: cannot run $command"
+		return 1
+	fi
+
+	if ! _run_rc_precmd; then
+		warn "failed precmd routine for ${name}"
+		return 1
+	fi
+
+	# setup the full command to run
+	#
+	check_startmsgs && echo "Starting ${name}."
+	if [ -n "$_chroot" ]; then
+				_doit="\
+${_nice:+nice -n $_nice }\
+chroot ${_user:+-u $_user }${_group:+-g $_group }${_groups:+-G $_groups }\
+$_chroot $command $rc_flags $command_args"
+			else
+				_doit="\
+${_chdir:+cd $_chdir && }\
+$command $rc_flags $command_args"
+		if [ -n "$_user" ]; then
+			_doit="su -m $_user -c 'sh -c \"$_doit\"'"
+		fi
+		if [ -n "$_nice" ]; then
+			if [ -z "$_user" ]; then
+				_doit="sh -c \"$_doit\""
+			fi
+			_doit="nice -n $_nice $_doit"
+		fi
+	fi
+
+	# run the full command
+	#
+	if ! _run_rc_doit "$_doit"; then
+		warn "failed to start ${name}"
+	return 1
+	fi
+
+	# finally, run postcmd
+	#
+	_run_rc_postcmd
+}
+
+
 #
 # run_rc_script file arg
 #	Start the script `file' with `arg', and correctly handle the

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPd55qC_dVy=SNoi%2Bwn1qXo=nQ54yk2yiVpk-xzKtvZqW3Kbkg>