From: Friedrich Weber Date: Fri, 6 Oct 2023 12:15:33 +0000 (+0200) Subject: vm start: set higher timeout if using PCI passthrough X-Git-Url: https://git.proxmox.com/?p=qemu-server.git;a=commitdiff_plain;h=95f1de689e3c898382f8fcc721b024718a0c910a vm start: set higher timeout if using PCI passthrough The default VM startup timeout is `max(30, VM memory in GiB)` seconds. Multiple reports in the forum [0] [1] and the bug tracker [2] suggest this is too short when using PCI passthrough with a large amount of VM memory, since QEMU needs to map the whole memory during startup (see comment #2 in [2]). As a result, VM startup fails with "got timeout". To work around this, set a larger default timeout if at least one PCI device is passed through. The question remains how to choose an appropriate timeout. Users reported the following startup times: ref | RAM | time | ratio (s/GiB) --------------------------------- [1] | 60G | 135s | 2.25 [1] | 70G | 157s | 2.24 [1] | 80G | 277s | 3.46 [2] | 65G | 213s | 3.28 [2] | 96G | >290s | >3.02 The data does not really indicate any simple (e.g. linear) relationship between RAM and startup time (even data from the same source). However, to keep the heuristic simple, assume linear growth and multiply the default timeout by 4 if at least one `hostpci[n]` option is present, obtaining `4 * max(30, VM memory in GiB)`. This covers all cases above, and should still leave some headroom. [0]: https://forum.proxmox.com/threads/83765/post-552071 [1]: https://forum.proxmox.com/threads/126398/post-592826 [2]: https://bugzilla.proxmox.com/show_bug.cgi?id=3502 Suggested-by: Fiona Ebner Signed-off-by: Friedrich Weber --- diff --git a/PVE/QemuServer/Helpers.pm b/PVE/QemuServer/Helpers.pm index 8817427..0afb631 100644 --- a/PVE/QemuServer/Helpers.pm +++ b/PVE/QemuServer/Helpers.pm @@ -152,6 +152,13 @@ sub config_aware_timeout { $timeout = int($memory/1024); } + # When using PCI passthrough, users reported much higher startup times, + # growing with the amount of memory configured. Constant factor chosen + # based on user reports. + if (grep(/^hostpci[0-9]+$/, keys %$config)) { + $timeout *= 4; + } + if ($is_suspended && $timeout < 300) { $timeout = 300; }