mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
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:
parent
e0139e3044
commit
16bcb3b616
@ -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 &&
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user