Hello Saggi Mizrahi, Dima Kuznetsov, I'd like you to do a code review. Please visit
http://gerrit.ovirt.org/36953 to review the following change. Change subject: oop: Use a single instance of IOProcess per SD ...................................................................... oop: Use a single instance of IOProcess per SD Next step after switching from RFH to IOPROC is to use a single IOProcess instance for each SD. Currently only a single IOProcess instance is used for all SDs. To avoid load on the system by holding many unused IOProcesses we will maintain dictionary: KEY - domainID, VALUE - (timestamp, IOPROC) When IOProc for domainID is used we will renew the timestamp, or delete the item from dictionary We will also maintain another dictionary: KEY - domainID, VALUE - IOPROC weakref, that will allow us to check if IOPROC obj is still alive or needs to be recreated. Change-Id: I383fe617ee4ce22de368ba54f980887d70ff37c5 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1126206 Signed-off-by: Yeela Kaplan <ykap...@redhat.com> Reviewed-on: http://gerrit.ovirt.org/31501 Reviewed-by: Dima Kuznetsov <dkuzn...@redhat.com> Reviewed-by: Saggi Mizrahi <smizr...@redhat.com> --- M lib/vdsm/config.py.in M vdsm/storage/outOfProcess.py 2 files changed, 51 insertions(+), 15 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/53/36953/1 diff --git a/lib/vdsm/config.py.in b/lib/vdsm/config.py.in index ab330be..9dcc487 100644 --- a/lib/vdsm/config.py.in +++ b/lib/vdsm/config.py.in @@ -315,8 +315,13 @@ ('process_pool_timeout', '60', None), + ('max_ioprocess_idle_time', '60', + 'TTL of an unused IOProcess instance'), + ('process_pool_max_slots_per_domain', '10', None), + ('process_pool_max_queued_slots_per_domain', '10', None), + ('iscsi_default_ifaces', 'default', 'Comma seperated ifaces to connect with. ' 'i.e. iser,default'), diff --git a/vdsm/storage/outOfProcess.py b/vdsm/storage/outOfProcess.py index 17445e6..75fbb14 100644 --- a/vdsm/storage/outOfProcess.py +++ b/vdsm/storage/outOfProcess.py @@ -24,6 +24,7 @@ import stat import sys import types +import weakref from vdsm import constants from vdsm.config import config @@ -45,10 +46,16 @@ _oopImpl = RFH DEFAULT_TIMEOUT = config.getint("irs", "process_pool_timeout") +IOPROC_IDLE_TIME = config.getint("irs", "max_ioprocess_idle_time") HELPERS_PER_DOMAIN = config.getint("irs", "process_pool_max_slots_per_domain") +MAX_QUEUED = config.getint("irs", "process_pool_max_queued_slots_per_domain") -_procLock = threading.Lock() -_proc = {} +_procPoolLock = threading.Lock() +_procPool = {} +_refProcPool = {} +_rfhPool = {} + +elapsed_time = lambda: os.times()[4] log = logging.getLogger('Storage.oop') @@ -61,20 +68,44 @@ _oopImpl = RFH -def getProcessPool(clientName): - try: - return _proc[clientName] - except KeyError: - with _procLock: - if _oopImpl == IOPROC: - if GLOBAL not in _proc: - _proc[GLOBAL] = _OopWrapper(IOProcess(DEFAULT_TIMEOUT)) - _proc[clientName] = _proc[GLOBAL] - else: - _proc[clientName] = _OopWrapper( - RemoteFileHandlerPool(HELPERS_PER_DOMAIN)) +def cleanIdleIOProcesses(clientName): + now = elapsed_time() + for name, (eol, proc) in _procPool.items(): + if (eol < now and name != clientName): + del _procPool[name] - return _proc[clientName] + +def _getRfhPool(clientName): + with _procPoolLock: + try: + return _rfhPool[clientName] + except KeyError: + _rfhPool[clientName] = _OopWrapper( + RemoteFileHandlerPool(HELPERS_PER_DOMAIN)) + + return _rfhPool[clientName] + + +def _getIOProcessPool(clientName): + with _procPoolLock: + cleanIdleIOProcesses(clientName) + + proc = _refProcPool.get(clientName, lambda: None)() + if proc is None: + proc = _OopWrapper(IOProcess(max_threads=HELPERS_PER_DOMAIN, + timeout=DEFAULT_TIMEOUT, + max_queued_requests=MAX_QUEUED)) + _refProcPool[clientName] = weakref.ref(proc) + + _procPool[clientName] = (elapsed_time() + IOPROC_IDLE_TIME, proc) + return proc + + +def getProcessPool(clientName): + if _oopImpl == IOPROC: + return _getIOProcessPool(clientName) + else: + return _getRfhPool(clientName) def getGlobalProcPool(): -- To view, visit http://gerrit.ovirt.org/36953 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I383fe617ee4ce22de368ba54f980887d70ff37c5 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: ovirt-3.5 Gerrit-Owner: Yeela Kaplan <ykap...@redhat.com> Gerrit-Reviewer: Dima Kuznetsov <dkuzn...@redhat.com> Gerrit-Reviewer: Saggi Mizrahi <smizr...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches