[Pkg-xen-devel] [PATCH] debian/scripts: Optimize scripts

Elliott Mitchell ehem+debian at m5p.com
Tue Sep 22 02:24:12 BST 2020


Fewer fork()s and execve()s quickly add up to significant savings.  I'm
concerned Debian is slowly headed towards recreating SunOS^WSolaris
5.7^W2.7^W7 and the layers and layers of scripts which killed
performance.

As these runtime scripts are heavily used, avoid all uses of external
programs by them.

Signed-off-by: Elliott Mitchell <ehem+debian at m5p.com>
---
The gains from this should be rather larger than from going over the
build scripts.  Since `xen-utils-wrapper` is used to wrap pretty well
all of the Xen userspace programs this could be surprisingly large.

General approach is to be more optimistic about things working
successfully and only handling errors closer to the end.  This also
switches to `read` which is a shell built-in from `cat` which is not.
This also brings retrieval of values from /sys into the script itself,
rather than calling an external helper.

I notice a computer of mine needed ~2800 processes to restore 5 VMs.
This is based on the delta from low-numbered xvd process to high-numbered
xvd process.  Perhaps this isn't a huge number, but I note prior to this
simply running `xl list` caused the forking of 4 processes, whereas with
this it now takes 1.

Yes, it is possible to do too much using scripts.
---
 debian/scripts/xen-utils-wrapper | 39 +++++++++++++++++++++++++++++---
 debian/scripts/xen-version       |  6 +++--
 2 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/debian/scripts/xen-utils-wrapper b/debian/scripts/xen-utils-wrapper
index 4d27a62d33..451cdb59f3 100755
--- a/debian/scripts/xen-utils-wrapper
+++ b/debian/scripts/xen-utils-wrapper
@@ -1,6 +1,39 @@
 #!/bin/sh -e
 
-COMMAND="$(basename $0)"
-DIR=$(/usr/lib/xen-common/bin/xen-dir)
+# This portion is fast-path, avoid external programs
+
+COMMAND="${0##*/}"
+
+DIR=/sys/hypervisor/version
+[ -e $DIR/major ] && read major < $DIR/major
+[ -e $DIR/minor ] && read minor < $DIR/minor
+VERSION="$major.$minor"
+
+DIR="/usr/lib/xen-$VERSION/bin"
+
+exec "$DIR/$COMMAND" "$@" || fail=$?
+
+
+# Certainly didn't work, now report failures, slower-path
+
+error() {
+	err="$1"
+	shift
+	echo "ERROR: " "$@" >&2
+	exit $err
+}
+
+[ -e "/sys/hypervisor/type" ] || error 1 "Can't find hypervisor information in sysfs!"
+
+read type < /sys/hypervisor/type
+if [ "$type" != xen ]; then
+	[ -n "$type" ] || error 1 "Can't read hypervisor type from sysfs!"
+	error 1 "Hypervisor is not xen but '$type'!"
+fi
+
+if [ ! -d "/usr/lib/xen-$VERSION" ]; then
+	error 127 "Can't find version $VERSION of xen utils (maybe xen-utils-$VERSION was already removed before rebooting out of Xen $VERSION), bailing out!"
+fi
+
+error 127 "Failed to execute $COMMAND: return $fail"
 
-exec "$DIR/bin/$COMMAND" "$@"
diff --git a/debian/scripts/xen-version b/debian/scripts/xen-version
index 492070a43b..5c42ad7351 100755
--- a/debian/scripts/xen-version
+++ b/debian/scripts/xen-version
@@ -6,10 +6,12 @@ error() {
 }
 
 if [ -e "/sys/hypervisor/type" ]; then
-    type="$(cat /sys/hypervisor/type)"
+    read type < /sys/hypervisor/type
     if [ "$type" = xen ]; then
         DIR=/sys/hypervisor/version
-        VERSION="$(cat $DIR/major).$(cat $DIR/minor)"
+        read major < $DIR/major
+        read minor < $DIR/minor
+        VERSION="$major.$minor"
     elif [ -z "$type" ]; then
         error "Can't read hypervisor type from sysfs!"
     else
-- 
2.20.1





-- 
(\___(\___(\______          --=> 8-) EHM <=--          ______/)___/)___/)
 \BS (    |         ehem+sigmsg at m5p.com  PGP 87145445         |    )   /
  \_CS\   |  _____  -O #include <stddisclaimer.h> O-   _____  |   /  _/
8A19\___\_|_/58D2 7E3D DDF4 7BA6 <-PGP-> 41D1 B375 37D0 8714\_|_/___/5445





More information about the Pkg-xen-devel mailing list