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

Elliott Mitchell ehem+debian at m5p.com
Wed Sep 23 02:40:32 BST 2020


Sometimes it really helps to be able to guess what is going on behind the
scenes to produce the right result.  As such below is a v2 of this patch.
I provided my guesses for the numbers, this time I've got actual data.
The appropriate command is:

strace -f -o trace.out -e trace=%process /usr/sbin/xl list

The system calls of interest are clone(), which is the Linux system call
behind fork(); and execve() which is the one which actually executes a
program.  On modern flavors of Unix (like Linux) fork() has become *much*
cheaper, memory pages will only be copied as they are modified.  Despite
the lower cost, clone() is an *expensive* system call, allocating a new
process table entry and extensively modifying page tables.  execve()
isn't nearly as expensive, but does hint at complexity.

With the version presently in git, strace reported 6 clone() calls and
7 execve() calls.  With the attached version, strace reported 0 clone()
calls and 2 execve() calls.  This suggests a substantial reduction in
overhead by using the attached.

You may dislike not using -e for the first part, but that was reviewed
carefully to ensure any failures would be handled correctly.

The only potential difference is if a hypervisor using identical
versioning and files were present (presented
/sys/hypervisor/version/major and /sys/hypervisor/version/minor which
matched a version of Xen which was installed), one might get an error out
of the Xen utility instead of the script (ie `xl` could complain instead
of the script).  Sharing both major and minor versions for a Debian
release seems unlikely and would likely diverge quickly.  As such I
consider the gains to *heavily* outweigh this potential downside.


>From 7a5d43be30657fdb70c18050dc3d9e941a564e46 Mon Sep 17 00:00:00 2001
From: Elliott Mitchell <ehem+debian at m5p.com>
Date: Sun, 20 Sep 2020 21:28:53 -0700
Subject: [PATCH] debian/scripts: Optimize scripts

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>
---
 debian/scripts/xen-utils-wrapper | 43 +++++++++++++++++++++++++++++---
 debian/scripts/xen-version       |  6 +++--
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/debian/scripts/xen-utils-wrapper b/debian/scripts/xen-utils-wrapper
index 4d27a62d33..a38ccc25fb 100755
--- a/debian/scripts/xen-utils-wrapper
+++ b/debian/scripts/xen-utils-wrapper
@@ -1,6 +1,41 @@
-#!/bin/sh -e
+#!/bin/sh
 
-COMMAND="$(basename $0)"
-DIR=$(/usr/lib/xen-common/bin/xen-dir)
+# This portion is fast-path, avoid external programs, NOTE: NOT -e HERE!
+
+COMMAND="${0##*/}"
+
+DIR=/sys/hypervisor/version
+read major 2> /dev/null < $DIR/major
+read minor 2> /dev/null < $DIR/minor
+VERSION="$major.$minor"
+
+DIR="/usr/lib/xen-$VERSION/bin"
+
+exec "$DIR/$COMMAND" "$@"
+fail=$?
+
+
+# Certainly didn't work, now report failures, slower-path
+set -e
+
+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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-debian-scripts-Optimize-scripts.patch
Type: text/x-diff
Size: 2708 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-xen-devel/attachments/20200922/adf18b6a/attachment-0001.patch>


More information about the Pkg-xen-devel mailing list