qemu: Drop qemuDomainMemoryLimit

This function is to guess the correct limit for maximal memory
usage by qemu for given domain. This can never be guessed
correctly, not to mention all the pains and sleepless nights this
code has caused. Once somebody discovers algorithm to solve the
Halting Problem, we can compute the limit algorithmically. But
till then, this code should never see the light of the release
again.
This commit is contained in:
Michal Privoznik 2013-08-09 14:46:54 +02:00
parent e0139e3044
commit 16bcb3b616
5 changed files with 3 additions and 55 deletions

View File

@ -428,8 +428,7 @@ qemuSetupMemoryCgroup(virDomainObjPtr vm)
}
}
if (virCgroupSetMemoryHardLimit(priv->cgroup,
qemuDomainMemoryLimit(vm->def)) < 0)
if (virCgroupSetMemoryHardLimit(priv->cgroup, vm->def->mem.hard_limit) < 0)
return -1;
if (vm->def->mem.soft_limit != 0 &&

View File

@ -9220,7 +9220,7 @@ qemuBuildCommandLine(virConnectPtr conn,
}
if (mlock)
virCommandSetMaxMemLock(cmd, qemuDomainMemoryLimit(def) * 1024);
virCommandSetMaxMemLock(cmd, def->mem.hard_limit * 1024);
virObjectUnref(cfg);
return cmd;

View File

@ -2306,55 +2306,6 @@ cleanup:
return ret;
}
unsigned long long
qemuDomainMemoryLimit(virDomainDefPtr def)
{
unsigned long long mem;
size_t i;
if (def->mem.hard_limit) {
mem = def->mem.hard_limit;
} else {
/* If there is no hard_limit set, compute a reasonable one to avoid
* system thrashing caused by exploited qemu. A 'reasonable
* limit' has been chosen:
* (1 + k) * (domain memory + total video memory) + (32MB for
* cache per each disk) + F
* where k = 0.5 and F = 400MB. The cache for disks is important as
* kernel cache on the host side counts into the RSS limit.
* Moreover, VFIO requires some amount for IO space. Alex Williamson
* suggested adding 1GiB for IO space just to be safe (some finer
* tuning might be nice, though).
*
* Technically, the disk cache does not have to be included in
* RLIMIT_MEMLOCK but it doesn't hurt as it's just an upper limit and
* it makes this function and its usage simpler.
*/
mem = def->mem.max_balloon;
for (i = 0; i < def->nvideos; i++)
mem += def->videos[i]->vram;
mem *= 1.5;
mem += def->ndisks * 32768;
mem += 409600;
for (i = 0; i < def->nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = def->hostdevs[i];
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
hostdev->source.subsys.type ==
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
hostdev->source.subsys.u.pci.backend ==
VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
mem += 1024 * 1024;
break;
}
}
}
return mem;
}
int
qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
virDomainObjPtr vm)

View File

@ -365,8 +365,6 @@ extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
unsigned long long qemuDomainMemoryLimit(virDomainDefPtr def);
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
virDomainObjPtr vm);

View File

@ -1030,7 +1030,7 @@ int qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
*/
vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
virProcessSetMaxMemLock(vm->pid,
qemuDomainMemoryLimit(vm->def) * 1024);
vm->def->mem.hard_limit * 1024);
vm->def->hostdevs[vm->def->nhostdevs--] = NULL;
}