<div> </div><div> </div><div>06.03.2020, 11:01, "Satish Patel" <satish.txt@gmail.com>:</div><blockquote><p>I am running CentOS 7.6 and it doesn't have RPM available for 4.x<br />release i have to compile it or try to install fedora one. Let me tell<br />you why i am doing all these exercise.<br /><br />We are planning to run Erlang (mongooseIM) application on openstack<br />instance, before i move to production i started doing some<br />load-testing on openstack vm and this is what i did.<br /><br />- I have HP Gen9 server which has 40 core CPU (with HT) so i add this<br />machine in openstack and reserve 8 cpu for host using vcpu_pin_set.<br />- I have created 32 vcpu core virtual machine on this compute node<br />with --property hw:numa_nodes=2 option and also added dedicated and<br />hugepage properties for best performance<br />- In lstopo command i can see two numa with 2 socket / 8 core / 2<br />thread per numa topology on my guest VM<br />- I have installed erlang (mongooseIM) application and start<br />load-testing and found very very poor result (i would say worst)<br />- For experiment i told erlang to bind all process to numa0 (0-16<br />vcpu) and found benchmark result was good much better.<br />- Problem is if i run erlang on single numa then i am wasting my CPU<br />core for second numa (i want to utilize all CPU to get best<br />performance)<br />- For experiment i have disable hyperthreading on openstack compute<br />node and build new VM with hw:numa_node=2 option and found best result<br />in benchmark.</p></blockquote><div> </div><div>Basically, there are two factors so far:</div><div>1) whether the workload or some of its threads are compute intensive?</div><div>2) cross numa memory access -- this is definitely a negative factor.</div><div>In your first try (HT enabled, binding erlang to numa0), the performance improvement could be because of the avoiding of cross numa memory access.</div><div>The second try (HT disabled), the performance boost could be because of disabling HT if the workload is compute intensive.</div><div> </div><div>Have you tried to compare the HT enabled case and HT disabled case in bare metal? If it still gets significant performance improvement, then most likely the second try is because of disabling HT.  So far IMHO we do not have enough evidence to accuse virtual cpu topology though I am as curious as you in that direction. Maybe what is worth trying is to boot up VMs directly from libvirt or qemu with various configurations.</div><div> </div><blockquote><p>Now question is why erlang doesn't like dual numa openstack vm with HT<br />enable, it seems erlang looking at CPU Topology and something is<br />missing or broken in TOPOLOGY of kvm when trying to utilize both numa<br />and result poor performance.<br /><br />last few days i am trying to solve this mystery and even i contact<br />erlang developer but didn't get any help.<br /><br />On Thu, Mar 5, 2020 at 8:15 PM Eddie Yen <<a href="mailto:missile0407@gmail.com">missile0407@gmail.com</a>> wrote:</p><blockquote><br /> Hi Satish,<br /><br /> Using host-passthrough on KVM is not only passthrough the physical<br /> host CPU model, but will also "try" passthrough the same CPU flags.<br /> That means the vcpu will contain the flags same as host CPU, but it<br /> still depends on how KVM can support. In other words, KVM will only<br /> set the flags what the host CPU have and what KVM itself can support.<br /><br /> Since QEMU has released to 4.2.0, perhaps you can try the latest<br /> version and doing the pure KVM running to see if it bring up the<br /> performance and consider upgrade KVM on compute nodes.<br /><br /> Satish Patel <<a href="mailto:satish.txt@gmail.com">satish.txt@gmail.com</a>> 於 2020年3月6日 週五 上午1:11寫道&#xff1a;<blockquote><br /> Eddie,<br /><br /> I have tried everything to match or fix CPU Topology layout but its<br /> never come down to correct as i mentioned in screenshot, I have check<br /> on Alicloud and they are also running KVM and their virtual machine<br /> lstopo output is really match with physical machine, like L1i / L1d<br /> cache layout etc.<br /><br /> if you look at following output its strange i am using "-cpu host"<br /> option but still there are lots of missing flags on my virtual machine<br /> cpuinfo, is that normal?<br /><br /> This is my VM output (virtual machine)<br /><br /> # grep flags /proc/cpuinfo | uniq<br /> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov<br /> pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm<br /> constant_tsc arch_perfmon rep_good nopl xtopology eagerfpu pni<br /> pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt<br /> tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm<br /> arat fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt<br /><br /> This is compute machine (physical host)<br /><br /> # grep flags /proc/cpuinfo | uniq<br /> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov<br /> pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx<br /> pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl<br /> xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor<br /> ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1<br /> sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c<br /> rdrand lahf_lm abm epb invpcid_single intel_ppin ssbd ibrs ibpb stibp<br /> tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2<br /> smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida<br /> arat pln pts md_clear spec_ctrl intel_stibp flush_l1d<br /><br /> On Thu, Mar 5, 2020 at 11:26 AM Eddie Yen <<a href="mailto:missile0407@gmail.com">missile0407@gmail.com</a>> wrote:<br /> ><br /> > Hi Satish,<br /> ><br /> > Since you already set "cpu_mode = host-passthrough", there's no need<br /> > to set cpu_model.<br /> ><br /> > BTW, we're not known about the CPU topology a lot. But IME we always<br /> > set "hw_cpu_sockets = 2" in specified image or flavor metadata if running<br /> > Windows instance. In default, KVM always allocate all vcpus into sockets<br /> > in CPU topology, and this will affect the Windows VM performance since<br /> > Windows only support maximum 2 CPU sockets.<br /> ><br /> > Perhaps you can try limit socket numbers by setting hw_cpu_sockets in<br /> > image metadata (or hw:cpu_sockets in flavor metadata.)<br /> ><br /> > Satish Patel <<a href="mailto:satish.txt@gmail.com">satish.txt@gmail.com</a>> 於 2020年3月5日 週四 下午10:46寫道&#xff1a;<br /> >><br /> >><br /> >> cpu_mode = cpu-passthrough<br /> >> cpu_model = none<br /> >><br /> >> Do you think cpu_model make difference ?<br /> >><br /> >><br /> >> Sent from my iPhone<br /> >><br /> >> On Mar 5, 2020, at 7:18 AM, Satish Patel<<a href="mailto:satish.txt@gmail.com">satish.txt@gmail.com</a>> wrote:<br /> >><br /> >> &#xfeff;<br /> >><br /> >> cpu-passthrough<br /> >><br /> >> Sent from my iPhone<br /> >><br /> >> On Mar 4, 2020, at 9:24 PM, rui zang <<a href="mailto:rui.zang@yandex.com">rui.zang@yandex.com</a>> wrote:<br /> >><br /> >> &#xfeff;<br /> >> Hi,<br /> >><br /> >> What is the value for the "cpu_mode" configuration option?<br /> >> <a href="https://docs.openstack.org/mitaka/config-reference/compute/hypervisor-kvm.html">https://docs.openstack.org/mitaka/config-reference/compute/hypervisor-kvm.html</a><br /> >><br /> >> Thanks,<br /> >> Zang, Rui<br /> >><br /> >><br /> >> 05.03.2020, 01:24, "Satish Patel" <<a href="mailto:satish.txt@gmail.com">satish.txt@gmail.com</a>>:<br /> >><br /> >> Folks,<br /> >><br /> >> We are running openstack with KVM and i have noticed kvm presenting<br /> >> wrong CPU Tolopoly to VM and because of that we are seeing bad<br /> >> performance to our application.<br /> >><br /> >> This is openstack compute:<br /> >><br /> >> # lstopo-no-graphics --no-io<br /> >> Machine (64GB total)<br /> >> NUMANode L#0 (P#0 32GB) + Package L#0 + L3 L#0 (25MB)<br /> >> L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0<br /> >> PU L#0 (P#0)<br /> >> PU L#1 (P#20)<br /> >> L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1<br /> >> PU L#2 (P#1)<br /> >> PU L#3 (P#21)<br /> >><br /> >> This is VM running on above compute<br /> >><br /> >> # lstopo-no-graphics --no-io<br /> >> Machine (59GB total)<br /> >> NUMANode L#0 (P#0 29GB) + Package L#0 + L3 L#0 (16MB)<br /> >> L2 L#0 (4096KB) + Core L#0<br /> >> L1d L#0 (32KB) + L1i L#0 (32KB) + PU L#0 (P#0)<br /> >> L1d L#1 (32KB) + L1i L#1 (32KB) + PU L#1 (P#1)<br /> >> L2 L#1 (4096KB) + Core L#1<br /> >> L1d L#2 (32KB) + L1i L#2 (32KB) + PU L#2 (P#2)<br /> >> L1d L#3 (32KB) + L1i L#3 (32KB) + PU L#3 (P#3)<br /> >><br /> >> if you noticed P#0 and P#1 has own (32KB) cache per thread that is<br /> >> wrong presentation if you compare with physical CPU.<br /> >><br /> >> This is a screenshot of AWS vs Openstack CPU Topology and looking at<br /> >> openstack its presentation is little odd, is that normal?<br /> >><br /> >> <a href="https://imgur.com/a/2sPwJVC">https://imgur.com/a/2sPwJVC</a><br /> >><br /> >> I am running CentOS7.6 with kvm 2.12 version.<br /> >></blockquote></blockquote></blockquote>