[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] tools/xend: Fix performance of xend with more than 10000 FC device paths



# HG changeset patch
# User "Dube, Lutz" <lutz.dube@xxxxxxxxxxxxxx>
# Date 1279902875 -3600
# Node ID 4814e16ea4105502332407e3379c49da92018899
# Parent  e23302fcb83c72f93ec01285bd7f4f1641eb67e4
tools/xend: Fix performance of xend with more than 10000 FC device paths

On server startup xend start or a later xend restart needs approx. 30 min to
start/restart. Without attached FC devices xend start/restart needs only some
seconds.

server type: Fujitsu Primergy RX600-S5

The time gets lost in xen/xend/XendNode.py line 329 while calling
vscsi_util.get_all_scsi_device().

329         for pscsi_record in vscsi_util.get_all_scsi_devices():
330             scsi_id = pscsi_record['scsi_id']
331             if scsi_id:
332                 saved_HBA_uuid = None

I think, in most cases we don't need all the PSCSI devices registered in
xend, but only a few of it.
So a good solution for this perforamce issue is to scan only the SCSI device
paths we need, controlled by a new option in xend-config.sxp.

I have made a patch to allow specification of scsi devices we need in xend
in the config file xend-config.sxp.
The new options pscsi-device-mask expects a list of device ids oder partial
device ids like the option of lsscsi, e.g.
(pscsi-device-mask ('<partial-dev-id1' 'partial-dev-id2' ...))

Without this option set in xend-config.sxp or if lsscsi is not support, all
device paths are process like today.

Signed-off-by: Lutz Dube Lutz.Dube@xxxxxxxxxxxxxx
Comment from Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>: "Well done"
Committed-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 tools/examples/xend-config.sxp       |    8 ++++++++
 tools/python/xen/util/vscsi_util.py  |   11 ++++++-----
 tools/python/xen/xend/XendNode.py    |    7 ++++++-
 tools/python/xen/xend/XendOptions.py |    7 +++++++
 4 files changed, 27 insertions(+), 6 deletions(-)

diff -r e23302fcb83c -r 4814e16ea410 tools/examples/xend-config.sxp
--- a/tools/examples/xend-config.sxp    Fri Jul 23 17:26:28 2010 +0100
+++ b/tools/examples/xend-config.sxp    Fri Jul 23 17:34:35 2010 +0100
@@ -294,3 +294,11 @@
 # we have to realize this may incur security issue and we can't make sure the
 # device assignment could really work properly even after we do this.
 #(pci-passthrough-strict-check yes)
+
+# If we have a very big scsi device configuration, start of xend is slow,
+# because xend scans all the device paths to build its internal PSCSI device
+# list.  If we need only a few devices for assigning to a guest, we can reduce
+# the scan to this device. Set list list of device paths in same syntax like in
+# command lsscsi, e.g. ('16:0:0:0' '15:0') 
+# (pscsi-device-mask ('*'))
+
diff -r e23302fcb83c -r 4814e16ea410 tools/python/xen/util/vscsi_util.py
--- a/tools/python/xen/util/vscsi_util.py       Fri Jul 23 17:26:28 2010 +0100
+++ b/tools/python/xen/util/vscsi_util.py       Fri Jul 23 17:34:35 2010 +0100
@@ -148,11 +148,12 @@ def _vscsi_get_scsidevices_by_sysfs():
     return devices
 
 
-def vscsi_get_scsidevices():
+def vscsi_get_scsidevices(mask=""):
     """ get all scsi devices information """
 
-    devices = _vscsi_get_scsidevices_by_lsscsi("")
-    if devices:
+    devices = _vscsi_get_scsidevices_by_lsscsi("[%s]" % mask)
+    if devices or (len(mask) and mask[0] != "*"):
+        # devices found or partial device scan
         return devices
     return _vscsi_get_scsidevices_by_sysfs()
 
@@ -274,9 +275,9 @@ def get_scsi_device(pHCTL):
             return _make_scsi_record(scsi_info)
     return None
 
-def get_all_scsi_devices():
+def get_all_scsi_devices(mask=""):
     scsi_records = []
-    for scsi_info in vscsi_get_scsidevices():
+    for scsi_info in vscsi_get_scsidevices(mask):
         scsi_record = _make_scsi_record(scsi_info)
         scsi_records.append(scsi_record)
     return scsi_records
diff -r e23302fcb83c -r 4814e16ea410 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Fri Jul 23 17:26:28 2010 +0100
+++ b/tools/python/xen/xend/XendNode.py Fri Jul 23 17:34:35 2010 +0100
@@ -326,7 +326,12 @@ class XendNode:
         pscsi_table = {}
         pscsi_HBA_table = {}
 
-        for pscsi_record in vscsi_util.get_all_scsi_devices():
+        pscsi_records = []
+        for pscsi_mask in xendoptions().get_pscsi_device_mask():
+            pscsi_records += vscsi_util.get_all_scsi_devices(pscsi_mask)
+        log.debug("pscsi record count: %s" % len(pscsi_records))
+
+        for pscsi_record in pscsi_records:
             scsi_id = pscsi_record['scsi_id']
             if scsi_id:
                 saved_HBA_uuid = None
diff -r e23302fcb83c -r 4814e16ea410 tools/python/xen/xend/XendOptions.py
--- a/tools/python/xen/xend/XendOptions.py      Fri Jul 23 17:26:28 2010 +0100
+++ b/tools/python/xen/xend/XendOptions.py      Fri Jul 23 17:34:35 2010 +0100
@@ -164,6 +164,9 @@ class XendOptions:
         """
         print >>sys.stderr, "xend [ERROR]", fmt % args
 
+    """Default mask for pscsi device scan."""
+    xend_pscsi_device_mask = ['*']
+
 
     def configure(self):
         self.set_config()
@@ -429,6 +432,10 @@ class XendOptions:
     def get_pci_dev_assign_strict_check(self):
         return self.get_config_bool("pci-passthrough-strict-check",
                                     self.pci_dev_assign_strict_check_default)
+
+    def get_pscsi_device_mask(self):
+        return self.get_config_value("pscsi-device-mask",
+                                      self.xend_pscsi_device_mask)
 
 class XendOptionsFile(XendOptions):
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.