mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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@ts.fujitsu.com
Comment from Masaki Kanno <kanno.masaki@jp.fujitsu.com>: "Well done"
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
2bdc928237
commit
c290fa1c4b
4 files changed
+27
-6
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
@@ -430,6 +433,10 @@ class XendOptions:
|
||||
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):
|
||||
|
||||
"""Default path to the config file."""
|
||||
|
||||