Royce Lv has uploaded a new change for review. Change subject: [WIP]add mem cgroup support to vdsm ......................................................................
[WIP]add mem cgroup support to vdsm add vdsm mem cgroup support, New version libvirt memtune function has a bug, tested uncompleted until I fix the bug. Change-Id: If2ad220e21b114985ead4bd64e81133173566444 Signed-off-by: Royce Lv<[email protected]> --- M vdsm/API.py M vdsm/BindingXMLRPC.py M vdsm/define.py M vdsm/libvirtvm.py M vdsm_api/vdsmapi-schema.json M vdsm_cli/vdsClient.py 6 files changed, 90 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/31/8031/1 diff --git a/vdsm/API.py b/vdsm/API.py index 566d6e5..f5889f9 100644 --- a/vdsm/API.py +++ b/vdsm/API.py @@ -37,6 +37,7 @@ import storage.volume import storage.sd import storage.image +import storage.storage_exception as se from vdsm.define import doneCode, errCode, Kbytes, Mbytes import caps from vdsm.config import config @@ -555,6 +556,19 @@ message = USER_SHUTDOWN_MESSAGE return v.shutdown(delay, message) + def tuneMem(self, tuneParams): + try: + v = self._cif.vmContainer[self._UUID] + for key in tuneParams: + tuneParams[key] = storage.misc.validateN( + tuneParams[key], key) + except KeyError: + return errCode['noVM'] + except se.InvalidParameterException: + return errCode['tuneMemErr'] + + return v.tuneMem(tuneParams) + def _createSysprepFloppyFromInf(self, infFileBinary, floppyImage): try: rc, out, err = utils.execCmd([constants.EXT_MK_SYSPREP_FLOPPY, diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py index 826c125..fe7b9d5 100644 --- a/vdsm/BindingXMLRPC.py +++ b/vdsm/BindingXMLRPC.py @@ -265,6 +265,10 @@ vm = API.VM(vmId) return vm.snapshot(snapDrives) + def vmTuneMem(self, params): + vm = API.VM(params.pop('vmId')) + return vm.tuneMem(params) + def vmMerge(self, vmId, mergeDrives): vm = API.VM(vmId) return vm.merge(mergeDrives) @@ -765,7 +769,8 @@ (self.vmHotplugDisk, 'hotplugDisk'), (self.vmHotunplugDisk, 'hotunplugDisk'), (self.vmHotplugNic, 'hotplugNic'), - (self.vmHotunplugNic, 'hotunplugNic')) + (self.vmHotunplugNic, 'hotunplugNic'), + (self.vmTuneMem, 'tuneMem')) def getIrsMethods(self): return ((self.domainActivate, 'activateStorageDomain'), diff --git a/vdsm/define.py b/vdsm/define.py index 049d36c..ba71bf6 100644 --- a/vdsm/define.py +++ b/vdsm/define.py @@ -117,6 +117,9 @@ 'momErr': {'status': {'code': 54, 'message': 'Failed to set mom policy'}}, + 'tuneMemErr': {'status': + {'code': 56, + 'message': 'Failed to tune Mem'}}, 'recovery': {'status': {'code': 99, 'message': diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py index 4dc47e3..048fa7d 100644 --- a/vdsm/libvirtvm.py +++ b/vdsm/libvirtvm.py @@ -1887,6 +1887,22 @@ (snapFlags & libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE == libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE)} + def tuneMem(self, tuneParams): + try: + self._dom.setMemoryParameters(tuneParams) + for param in tuneParams: + self.conf[param] = tuneParams[param] + self.saveState() + return {'status': doneCode} + except libvirt.libvirtError, e: + self.log.error("TuneMem failed:%s", + e.message, exc_info=True) + return errCode['tuneMemErr'] + except LookupError: + self.log.error('TuneMem failed: unrecongnized params', + exc_info=True) + return errCode['tuneMemErr'] + def _runMerge(self): for mergeStatus in self.conf.get('liveMerge', []): if mergeStatus['status'] != MERGESTATUS.NOT_STARTED: diff --git a/vdsm_api/vdsmapi-schema.json b/vdsm_api/vdsmapi-schema.json index c0440d2..509a90c 100644 --- a/vdsm_api/vdsmapi-schema.json +++ b/vdsm_api/vdsmapi-schema.json @@ -5099,6 +5099,34 @@ {'command': {'class': 'VM', 'name': 'mergeStatus'}, 'returns': ['MergeStatus']} +## +# @TuneMemParams: +# +# Parameters for @VM.tuneMem. +# +# @hard_limit: Maximum memory the VM can consume +# +# @soft_limit: Memory limit during contention +# +# @min_gurantee: Min memory guranteed to the VM +# +# Since: 4.10.0 +## +{'type': 'TuneMemParams', + 'data': {'hard_limit': 'uint', 'soft_limit': 'uint', + 'min_gurantee': 'uint'}} +## +# @VM.tuneMem: +# +# Tune memory hard limits and min allocation guranteed. +# +# @TuneMemParams: Tunning parameters for memory +# +# Since: 4.10.0 +## +{'command': {'class': 'VM', 'name': 'tuneMem'}, + 'data': {'tuneParams': 'TuneMemParams'}} + ## Category: @Volume ########################################################### ## # @Volume: diff --git a/vdsm_cli/vdsClient.py b/vdsm_cli/vdsClient.py index fe2f083..8787c28 100644 --- a/vdsm_cli/vdsClient.py +++ b/vdsm_cli/vdsClient.py @@ -204,6 +204,16 @@ return self.ExecAndExit(self.s.create(params)) + def tuneMem(self, args): + params = {} + params['vmId'] = args[0] + if len(args) > 1: + for param in args[1:]: + if '=' in param: + key, value = line.split("=", 1) + params[key] = value + return self.ExecAndExit(self.s.tuneMem(params)) + def hotplugNic(self, args): nic = self._parseDriveSpec(args[1]) nic['type'] = 'interface' @@ -1801,6 +1811,19 @@ 'Optional additional parameters in dictionary format,' ' name:value,name:value' )), + 'tuneMem': (serv.tuneMem, + ('<vmId>' + '[hard_limit=value soft_limit=value min_gurantee]', + 'Parameters list: r=required, o=optional', + 'r vmId: The vm to be tuned', + 'o hard_limit=<value>: ' + 'maximum memory the VM can use(in KiB)', + 'o soft_limit=<value>:' + 'memory limit to enforce during memory contention', + 'o min_gurantee=<value>:' + 'min memory guranteed to the VM', + 'Tune memory hard limits and min allocation gurantee' + )), 'migrate': (serv.do_migrate, ('vmId=<id> method=<offline|online> src=<host:[port]> ' 'dst=<host:[port]>', -- To view, visit http://gerrit.ovirt.org/8031 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If2ad220e21b114985ead4bd64e81133173566444 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Royce Lv <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
