[libvirt] Analysis of the effect of adding PCIe root ports

Laine Stump laine at laine.org
Wed Oct 5 17:26:31 UTC 2016


On 10/05/2016 11:50 AM, Richard W.M. Jones wrote:
> I was asked to look at the impact on boot times of adding (empty) PCIe
> root ports to the device model.  The proposal from Laine is to add a
> few of these to every guest to allow hotplugging.
>
> Last time I looked into this I found that probing any (legacy) PCI
> device is expensive because of the inefficient way that qemu emulates
> accesses to PCI config space, requiring IIRC 2 or 4 VMEXITs to access
> every word.  (PCI slots which are not occupied are basically free, the
> problem is PCI devices).  At that time I did not look at Q35/PCIe at all.
>
> We generally aim for boot times under 600-700ms.  Probing PCI devices
> takes a significant fraction of this time.
>
> The detailed analysis is attached.  It comes from a program called
> 'boot-analysis'
> (https://github.com/libguestfs/libguestfs/tree/master/utils/boot-analysis).
> It is best viewed using 'less -r' so that you can see the colours.
>
> The summary table is:
>
>                 Number of ports       0       1      2      3     4
>
> bios:overhead                        874     884    875    878   935
> kernel:entry                         159     163    165    174   491
> kernel:initcalls-before-userspace    1065    1090   1110   1147  1263
> /init:udev-overhead                  173     187    185    193   301
> insmod virtio_pci                    43      41     41     41    74
>
>                 TOTAL                       + 51   + 62   + 119 + 750
>
>                       (All times are in milliseconds.)
>
> A few observations:
>
> (1) For #ports <= 3, each extra port adds around 30-40ms to the boot
> time, which is consistent with what I saw when I measured legacy PCI.

Thanks for doing this (and especially on such short notice!). This is 
interesting info. I'm wondering now if the discontinuity is due to going 
over a threshold in the number of pcie-root-ports, the number of total 
PCI controllers, or the total number of devices. This is significant 
because a couple of the patches in the "Use more PCIe less legacy PCI" 
patchset I sent a two weeks ago will eliminate both the 
dmi-to-pci-bridge and the pci-bridge in the default config (as long as 
there are no legacy PCI devices). If the "jump" is due to an increase in 
total devices, or total PCI controllers, then getting rid of those two 
will change the number of root-ports that can be added prior to the jump.

Even if this is the case, it seems like we still want to have as little 
fat as possible.


>
> (2) There is a sudden, unexplained and reproducible discontinuity when
> going from 3 to 4 ports.  (Because libguestfs uses other devices, this
> might not actually be 3 to 4 PCIe devices, this is spare ports after
> all the others added for libguestfs devices.)
>
> (3) "kernel:entry" covers a lot of initialization that happens before
> the kernel prints its version string.  This is moderately affected by
> adding PCIe ports until we hit the discontinuity.
>
> Based on this analysis I conclude:
>
> (a) Unless we can explain the discontinuity, avoid adding more than
> 3 root ports.
>
> (b) It would be nice to turn the whole thing off for people who don't
> care about / need hotplugging.

I had contemplated having an "availablePCIeSlots" (or something like 
that) that was either an attribute of the config, or an option in 
qemu.conf or libvirtd.conf. If we had such a setting, it could be set to 
"0".

>
> (c) We could make PCI probing a lot faster by having the kernel handle
> PCI config space.




More information about the libvir-list mailing list