Message ID | 20220613145022.183105-1-kyle.meyer@hpe.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: Increase KVM_MAX_VCPUS to 2048 | expand |
Kyle Meyer <kyle.meyer@hpe.com> writes: > Increase KVM_MAX_VCPUS to 2048 so we can run larger virtual machines. > > Notable changes: > > * KVM_CAP_MAX_VCPUS will return 2048. > * KVM_MAX_VCPU_IDS will increase from 4096 to 8192. > * KVM_HV_MAX_SPARSE_VCPU_SET_BITS will increase from 16 to 32. > > * CPUID[HYPERV_CPUID_IMPLEMENT_LIMITS (00x40000005)].EAX will now be 2048. > > * struct kvm will increase from 40336 B to 40464 B. > * struct kvm_arch will increase from 34488 B to 34616 B. > * struct kvm_ioapic will increase from 5240 B to 9848 B. > > * vcpu_mask in kvm_hv_flush_tlb will increase from 128 B to 256 B. > * vcpu_mask in kvm_hv_send_ipi will increase from 128 B to 256 B. FWIW, this one will go away when https://lore.kernel.org/kvm/20220606083655.2014609-11-vkuznets@redhat.com/ lands. > * vcpu_bitmap in ioapic_write_indirect will increase from 128 B to 256 B. > * vp_bitmap in sparse_set_to_vcpu_mask will increase from 128 B to 256 B. ... > * sparse_banks in kvm_hv_flush_tlb will increase from 128 B to 256 B. > * sparse_banks in kvm_hv_send_ipi will increase from 128 B to 256 B. and these two are going away with https://lore.kernel.org/kvm/20220606083655.2014609-13-vkuznets@redhat.com/ (at the cost of growing 'struct kvm_vcpu_hv') > > Signed-off-by: Kyle Meyer <kyle.meyer@hpe.com> > --- > arch/x86/include/asm/kvm_host.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 3a240a64ac68..58653c63899f 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -38,7 +38,7 @@ > > #define __KVM_HAVE_ARCH_VCPU_DEBUGFS > > -#define KVM_MAX_VCPUS 1024 > +#define KVM_MAX_VCPUS 2048 > > /* > * In x86, the VCPU ID corresponds to the APIC ID, and APIC IDs
On Mon, Jun 13, 2022 at 11:35 AM Kyle Meyer <kyle.meyer@hpe.com> wrote: > > Increase KVM_MAX_VCPUS to 2048 so we can run larger virtual machines. Does the host machine have 2048 CPUs (or more) as well in your usecase? I'm wondering if it makes sense to start configuring KVM_MAX_VCPUS based on NR_CPUS. That way KVM can scale up on large machines without using more memory on small machines. e.g. /* Provide backwards compatibility. */ #if NR_CPUS < 1024 #define KVM_MAX_VCPUS 1024 #else #define KVM_MAX_VCPUS NR_CPUS #endif The only downside I can see for this approach is if you are trying to kick the tires a new large VM on a smaller host because the new "large host" hardware hasn't landed yet. > > Notable changes: > > * KVM_CAP_MAX_VCPUS will return 2048. > * KVM_MAX_VCPU_IDS will increase from 4096 to 8192. > * KVM_HV_MAX_SPARSE_VCPU_SET_BITS will increase from 16 to 32. > > * CPUID[HYPERV_CPUID_IMPLEMENT_LIMITS (00x40000005)].EAX will now be 2048. > > * struct kvm will increase from 40336 B to 40464 B. > * struct kvm_arch will increase from 34488 B to 34616 B. > * struct kvm_ioapic will increase from 5240 B to 9848 B. > > * vcpu_mask in kvm_hv_flush_tlb will increase from 128 B to 256 B. > * vcpu_mask in kvm_hv_send_ipi will increase from 128 B to 256 B. > * vcpu_bitmap in ioapic_write_indirect will increase from 128 B to 256 B. > * vp_bitmap in sparse_set_to_vcpu_mask will increase from 128 B to 256 B. > * sparse_banks in kvm_hv_flush_tlb will increase from 128 B to 256 B. > * sparse_banks in kvm_hv_send_ipi will increase from 128 B to 256 B. > > Signed-off-by: Kyle Meyer <kyle.meyer@hpe.com> > --- > arch/x86/include/asm/kvm_host.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 3a240a64ac68..58653c63899f 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -38,7 +38,7 @@ > > #define __KVM_HAVE_ARCH_VCPU_DEBUGFS > > -#define KVM_MAX_VCPUS 1024 > +#define KVM_MAX_VCPUS 2048 > > /* > * In x86, the VCPU ID corresponds to the APIC ID, and APIC IDs > -- > 2.26.2 >
David Matlack <dmatlack@google.com> writes: > On Mon, Jun 13, 2022 at 11:35 AM Kyle Meyer <kyle.meyer@hpe.com> wrote: >> >> Increase KVM_MAX_VCPUS to 2048 so we can run larger virtual machines. > > Does the host machine have 2048 CPUs (or more) as well in your usecase? > > I'm wondering if it makes sense to start configuring KVM_MAX_VCPUS > based on NR_CPUS. That way KVM can scale up on large machines without > using more memory on small machines. > > e.g. > > /* Provide backwards compatibility. */ > #if NR_CPUS < 1024 > #define KVM_MAX_VCPUS 1024 > #else > #define KVM_MAX_VCPUS NR_CPUS > #endif > > The only downside I can see for this approach is if you are trying to > kick the tires a new large VM on a smaller host because the new "large > host" hardware hasn't landed yet. FWIW, while I don't think there's anything wrong with such approach, it won't help much distro kernels which are not recompiled to meet the needs of a particular host. According to Kyle's numbers, the biggest growth is observed with 'struct kvm_ioapic' and that's only because of 'struct rtc_status' embedded in it. Maybe it's possible to use something different from a KVM_MAX_VCPU_IDS-bound flat bitmask there? I'm not sure how important this is as it's just another 4K per-VM and when guest's memory is taken into account it's probably not much. The growth in 'struct kvm'/'struct kvm_arch' seems to be insignificant and on-stack allocations are probably OK.
On Tue, Jun 14, 2022 at 1:28 AM Vitaly Kuznetsov <vkuznets@redhat.com> wrote: > > David Matlack <dmatlack@google.com> writes: > > > On Mon, Jun 13, 2022 at 11:35 AM Kyle Meyer <kyle.meyer@hpe.com> wrote: > >> > >> Increase KVM_MAX_VCPUS to 2048 so we can run larger virtual machines. > > > > Does the host machine have 2048 CPUs (or more) as well in your usecase? > > > > I'm wondering if it makes sense to start configuring KVM_MAX_VCPUS > > based on NR_CPUS. That way KVM can scale up on large machines without > > using more memory on small machines. > > > > e.g. > > > > /* Provide backwards compatibility. */ > > #if NR_CPUS < 1024 > > #define KVM_MAX_VCPUS 1024 > > #else > > #define KVM_MAX_VCPUS NR_CPUS > > #endif > > > > The only downside I can see for this approach is if you are trying to > > kick the tires a new large VM on a smaller host because the new "large > > host" hardware hasn't landed yet. Heh. My point here doesn't make sense. The actual number of CPUs in the host machine wouldn't matter, just the host kernel's NR_CPUS. > > FWIW, while I don't think there's anything wrong with such approach, it > won't help much distro kernels which are not recompiled to meet the > needs of a particular host. But is there a use-case for running a VM with more vCPUs than the kernel's NR_CPUS? > According to Kyle's numbers, the biggest > growth is observed with 'struct kvm_ioapic' and that's only because of > 'struct rtc_status' embedded in it. Maybe it's possible to use something > different from a KVM_MAX_VCPU_IDS-bound flat bitmask there? I'm not sure > how important this is as it's just another 4K per-VM and when guest's > memory is taken into account it's probably not much. > > The growth in 'struct kvm'/'struct kvm_arch' seems to be insignificant > and on-stack allocations are probably OK. > > -- > Vitaly >
On Thu, Jun 16, 2022, David Matlack wrote: > On Tue, Jun 14, 2022 at 1:28 AM Vitaly Kuznetsov <vkuznets@redhat.com> wrote: > > > > David Matlack <dmatlack@google.com> writes: > > > > > On Mon, Jun 13, 2022 at 11:35 AM Kyle Meyer <kyle.meyer@hpe.com> wrote: > > >> > > >> Increase KVM_MAX_VCPUS to 2048 so we can run larger virtual machines. > > > > > > Does the host machine have 2048 CPUs (or more) as well in your usecase? > > > > > > I'm wondering if it makes sense to start configuring KVM_MAX_VCPUS > > > based on NR_CPUS. That way KVM can scale up on large machines without > > > using more memory on small machines. > > > > > > e.g. > > > > > > /* Provide backwards compatibility. */ > > > #if NR_CPUS < 1024 > > > #define KVM_MAX_VCPUS 1024 > > > #else > > > #define KVM_MAX_VCPUS NR_CPUS > > > #endif > > > > > > The only downside I can see for this approach is if you are trying to > > > kick the tires a new large VM on a smaller host because the new "large > > > host" hardware hasn't landed yet. > > Heh. My point here doesn't make sense. The actual number of CPUs in > the host machine wouldn't matter, just the host kernel's NR_CPUS. > > > > > FWIW, while I don't think there's anything wrong with such approach, it > > won't help much distro kernels which are not recompiled to meet the > > needs of a particular host. > > But is there a use-case for running a VM with more vCPUs than the > kernel's NR_CPUS? With custom configs yes, e.g. my host kernel config for my anemic old system has CONFIG_NR_CPUS=12 and I occasionally run VMs with >12 vCPUs for testing purposes. But that obviously doesn't apply if KVM_MAX_VCPUS has a lower bound of 1024, so I agree that making KVM_MAX_VCPUS=max(1024, NR_CPUS) should do just fine.
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 3a240a64ac68..58653c63899f 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -38,7 +38,7 @@ #define __KVM_HAVE_ARCH_VCPU_DEBUGFS -#define KVM_MAX_VCPUS 1024 +#define KVM_MAX_VCPUS 2048 /* * In x86, the VCPU ID corresponds to the APIC ID, and APIC IDs
Increase KVM_MAX_VCPUS to 2048 so we can run larger virtual machines. Notable changes: * KVM_CAP_MAX_VCPUS will return 2048. * KVM_MAX_VCPU_IDS will increase from 4096 to 8192. * KVM_HV_MAX_SPARSE_VCPU_SET_BITS will increase from 16 to 32. * CPUID[HYPERV_CPUID_IMPLEMENT_LIMITS (00x40000005)].EAX will now be 2048. * struct kvm will increase from 40336 B to 40464 B. * struct kvm_arch will increase from 34488 B to 34616 B. * struct kvm_ioapic will increase from 5240 B to 9848 B. * vcpu_mask in kvm_hv_flush_tlb will increase from 128 B to 256 B. * vcpu_mask in kvm_hv_send_ipi will increase from 128 B to 256 B. * vcpu_bitmap in ioapic_write_indirect will increase from 128 B to 256 B. * vp_bitmap in sparse_set_to_vcpu_mask will increase from 128 B to 256 B. * sparse_banks in kvm_hv_flush_tlb will increase from 128 B to 256 B. * sparse_banks in kvm_hv_send_ipi will increase from 128 B to 256 B. Signed-off-by: Kyle Meyer <kyle.meyer@hpe.com> --- arch/x86/include/asm/kvm_host.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)