최근들어 요 내용에 대한 질문들을 많이 받았습니다.
AWS 의 EC2 인스턴스와의 비교부터 시작해서… 기타 등등..
제가 AWS 는 잘 몰라서 제대로 비교하기는 뭐하지만, AWS 의 EC2 상품은 일부를 제외하고는 8 CPU 상품은 4 Core, 8 Thread 상품인것 같습니다.
이러다보니까 VMware 와의 비교를 하면서 문의들이 시작이 되었죠.. 제가 알기로는 KVM Hypervisor 에서는 VM 의 소켓과 Thread 수를 조절할 수 있다고 합니다.
AWS 의 Nitro 기반 EC2 도 KVM 기반의 hypervisor 이기 때문에 가능한 것으로 보입니다.
결론부터 말씀드리면 ESXi 상에서는 VM 에다가 Hyper-threaded 를 노출시키지 않습니다.
만약 24 vCPU 를 할당했다라고 하면 VM 이 바라보는 것은 24 Core 24 Thread 이지, 12 Core 24 Thread 가 아닙니다.
그렇기 때문에 VM 에 대한 사이징을 할때는 Thread 수가 아닌 Core 수를 기준으로 하라고 말씀을 드리는 것입니다.
관련해서 따라 나오는 옵션이 PreferHT 옵션입니다. 이 옵션을 VM 에다가 Hyper-threaded 를 노출시키는 기능이다 라고 오해하시는 경우가 있는데, 그렇지 않습니다.
PreferHT 는 NUMA client (VM) 의 NUMA 토플로지와 연관된 옵션입니다.
아주 심플하게 말씀드리면, 제가 위에서 이렇게 말씀드렸죠.
- 그렇기 때문에 VM 에 대한 사이징을 할때는 Thread 수가 아닌 Core 수를 기준으로 하라고 말씀을 드리는 것입니다.
그 이유는 vNUMA 가 동작하는 조건과 연관이 있습니다.
vNUMA 가 동작하기 위해서는 다음 두가지 조건이 “AND” 로 만족되어야 합니다.
- VM 에 vCPU 를 9개 이상 할당했을 때
- VM 에 할당한 vCPU 수가 단일 소켓의 Core 수보다 많을 때
위 두가지가 만족이 되어야 합니다. 그렇다면 14 Cores x 2 socket 시스템 (HT=on 으로 56 thread) 에서 24 vCPU 를 VM 에다가 할당하면 어떻게 될까요? 위 두가지 조건을 만족하기 때문에 vNUMA 가 동작합니다.
DICT numvcpus = "24" DICT memSize = "32768" DICT displayName = "DVDStore_DB" DICT numa.autosize.cookie = "280001" DICT numa.autosize.vcpu.maxPerVirtualNode = "14" numaHost: NUMA config: consolidation= 1 preferHT= 0 numa: coresPerSocket= 1 maxVcpusPerVPD= 12 numaHost: 24 VCPUs 2 VPDs 2 PPDs numaHost: VCPU 0 VPD 0 PPD 0 numaHost: VCPU 1 VPD 0 PPD 0 numaHost: VCPU 2 VPD 0 PPD 0 numaHost: VCPU 3 VPD 0 PPD 0 numaHost: VCPU 4 VPD 0 PPD 0 numaHost: VCPU 5 VPD 0 PPD 0 numaHost: VCPU 6 VPD 0 PPD 0 numaHost: VCPU 7 VPD 0 PPD 0 numaHost: VCPU 8 VPD 0 PPD 0 numaHost: VCPU 9 VPD 0 PPD 0 numaHost: VCPU 10 VPD 0 PPD 0 numaHost: VCPU 11 VPD 0 PPD 0 numaHost: VCPU 12 VPD 1 PPD 1 numaHost: VCPU 13 VPD 1 PPD 1 numaHost: VCPU 14 VPD 1 PPD 1 numaHost: VCPU 15 VPD 1 PPD 1 numaHost: VCPU 16 VPD 1 PPD 1 numaHost: VCPU 17 VPD 1 PPD 1 numaHost: VCPU 18 VPD 1 PPD 1 numaHost: VCPU 19 VPD 1 PPD 1 numaHost: VCPU 20 VPD 1 PPD 1 numaHost: VCPU 21 VPD 1 PPD 1 numaHost: VCPU 22 VPD 1 PPD 1 numaHost: VCPU 23 VPD 1 PPD 1 2103975 2103975 U vmx-vcpu-0:DVDStore_ 135.239 WAIT 5.339 0.000 IDLE 130.425 130.200 0.080 0 -1 pct 24000 vm.2103942 16390 26 0 1 0-27 2103977 2103975 U vmx-vcpu-1:DVDStore_ 135.235 WAIT 1.081 0.000 IDLE 134.193 133.852 0.041 0 -1 pct 24000 vm.2103942 16390 8 0 1 0-27 2103978 2103975 U vmx-vcpu-2:DVDStore_ 135.235 WAIT 0.492 0.000 IDLE 134.698 134.328 0.054 0 -1 pct 24000 vm.2103942 16390 16 0 1 0-27 2103979 2103975 U vmx-vcpu-3:DVDStore_ 135.235 WAIT 0.574 0.000 IDLE 134.634 134.195 0.054 0 -1 pct 24000 vm.2103942 16390 12 0 1 0-27 2103980 2103975 U vmx-vcpu-4:DVDStore_ 135.234 WAIT 0.698 0.000 IDLE 134.549 134.144 0.048 0 -1 pct 24000 vm.2103942 16390 2 0 1 0-27 2103981 2103975 U vmx-vcpu-5:DVDStore_ 135.234 WAIT 1.910 0.000 IDLE 133.429 133.042 0.055 0 -1 pct 24000 vm.2103942 16390 10 0 1 0-27 2103982 2103975 U vmx-vcpu-6:DVDStore_ 135.234 WAIT 2.175 0.000 IDLE 133.334 132.911 0.037 0 -1 pct 24000 vm.2103942 16390 5 0 1 0-27 2103983 2103975 U vmx-vcpu-7:DVDStore_ 135.234 WAIT 2.287 0.000 IDLE 133.293 132.878 0.029 0 -1 pct 24000 vm.2103942 16390 26 0 1 0-27 2103984 2103975 U vmx-vcpu-8:DVDStore_ 135.234 WAIT 2.744 0.000 IDLE 132.873 132.426 0.036 0 -1 pct 24000 vm.2103942 16390 7 0 1 0-27 2103985 2103975 U vmx-vcpu-9:DVDStore_ 135.233 WAIT 2.015 0.000 IDLE 133.486 133.040 0.025 0 -1 pct 24000 vm.2103942 16390 0 0 1 0-27 2103986 2103975 U vmx-vcpu-10:DVDStore 135.233 WAIT 2.489 0.000 IDLE 133.041 132.593 0.034 0 -1 pct 24000 vm.2103942 16390 20 0 1 0-27 2103987 2103975 U vmx-vcpu-11:DVDStore 135.233 WAIT 1.972 0.000 IDLE 133.457 133.032 0.030 0 -1 pct 24000 vm.2103942 16390 17 0 1 0-27 2103988 2103975 U vmx-vcpu-12:DVDStore 135.233 WAIT 1.084 0.000 IDLE 134.188 133.780 0.026 0 -1 pct 24000 vm.2103942 16390 34 0 1 28-55 2103989 2103975 U vmx-vcpu-13:DVDStore 135.233 WAIT 0.638 0.000 IDLE 134.552 134.099 0.029 0 -1 pct 24000 vm.2103942 16390 40 0 1 28-55 2103990 2103975 U vmx-vcpu-14:DVDStore 135.232 WAIT 0.973 0.000 IDLE 134.333 133.890 0.014 0 -1 pct 24000 vm.2103942 16390 47 0 1 28-55 2103991 2103975 U vmx-vcpu-15:DVDStore 135.232 WAIT 1.481 0.000 IDLE 133.666 133.256 0.022 0 -1 pct 24000 vm.2103942 16390 44 0 1 28-55 2103992 2103975 U vmx-vcpu-16:DVDStore 135.232 WAIT 0.596 0.000 IDLE 134.657 134.208 0.012 0 -1 pct 24000 vm.2103942 16390 36 0 1 28-55 2103993 2103975 U vmx-vcpu-17:DVDStore 135.232 WAIT 2.162 0.000 IDLE 133.350 132.900 0.015 0 -1 pct 24000 vm.2103942 16390 29 0 1 28-55 2103994 2103975 U vmx-vcpu-18:DVDStore 135.232 WAIT 2.047 0.000 IDLE 133.486 133.118 0.011 0 -1 pct 24000 vm.2103942 16390 32 0 1 28-55 2103995 2103975 U vmx-vcpu-19:DVDStore 135.231 WAIT 2.121 0.000 IDLE 133.385 132.946 0.016 0 -1 pct 24000 vm.2103942 16390 48 0 1 28-55 2103996 2103975 U vmx-vcpu-20:DVDStore 135.231 WAIT 1.761 0.000 IDLE 133.710 133.254 0.032 0 -1 pct 24000 vm.2103942 16390 54 0 1 28-55 2103997 2103975 U vmx-vcpu-21:DVDStore 135.231 WAIT 2.793 0.000 IDLE 132.637 132.180 0.012 0 -1 pct 24000 vm.2103942 16390 53 0 1 28-55 2103998 2103975 U vmx-vcpu-22:DVDStore 135.231 WAIT 2.044 0.000 IDLE 133.413 132.978 0.018 0 -1 pct 24000 vm.2103942 16390 50 0 1 28-55 2103999 2103975 U vmx-vcpu-23:DVDStore 135.231 WAIT 1.269 0.000 IDLE 133.979 133.545 0.019 0 -1 pct 24000 vm.2103942 16390 31 0 1 28-55
ESXTOP
그런데 VM 의 워크로드에 따라서, Core 보다 메모리 레이턴시에 민감하거나, 캐시에 민감한 workload 들이 있습니다. 그래서 vNUMA 가 동작하지 않도록 하는것이 유리한 경우가 있습니다. (간단한 예로 Big data workload 들)
이때 PreferHT 옵션을 사용할 수 있는데요, 이 옵션을 사용하면 아래 두가지 vNUMA 조건중 2번째 조건에 대한 내용이 변경됩니다.
- VM 에 vCPU 를 9개 이상 할당했을 때
- VM 에 할당한 vCPU 수가 단일 소켓의 Core 수보다 많을 때 –> VM 에 할당한 vCPU 수가 단일 소켓의 Thread 수보다 많을 때
위에서 동일한 VM 에 PreferHT option 을 줘보겠습니다.
실제로 테스트를 해보실 때에는 VM power off 후, numa.vcpu.preferHT = TRUE 로 셋팅하신 뒤, VM 의 vCPU 숫자 변경 후 power on, 다시 power off, vCPU 숫자 원복후 Power on 의 과정이 필요합니다.
그 이유는 최초에 생성된 vNUMA 토폴로지는 vCPU 숫자가 바뀌지 않는 이상 변동되지 않기 때문입니다.
DICT numvcpus = "24" DICT memSize = "32768" DICT displayName = "DVDStore_DB" DICT numa.autosize.cookie = "280001" DICT numa.autosize.vcpu.maxPerVirtualNode = "14" DICT numa.vcpu.preferHT = "TRUE" numaHost: NUMA config: consolidation= 1 preferHT= 1 numa: coresPerSocket= 1 maxVcpusPerVPD= 24 numaHost: 24 VCPUs 1 VPDs 1 PPDs numaHost: VCPU 0 VPD 0 PPD 0 numaHost: VCPU 1 VPD 0 PPD 0 numaHost: VCPU 2 VPD 0 PPD 0 numaHost: VCPU 3 VPD 0 PPD 0 numaHost: VCPU 4 VPD 0 PPD 0 numaHost: VCPU 5 VPD 0 PPD 0 numaHost: VCPU 6 VPD 0 PPD 0 numaHost: VCPU 7 VPD 0 PPD 0 numaHost: VCPU 8 VPD 0 PPD 0 numaHost: VCPU 9 VPD 0 PPD 0 numaHost: VCPU 10 VPD 0 PPD 0 numaHost: VCPU 11 VPD 0 PPD 0 numaHost: VCPU 12 VPD 0 PPD 0 numaHost: VCPU 13 VPD 0 PPD 0 numaHost: VCPU 14 VPD 0 PPD 0 numaHost: VCPU 15 VPD 0 PPD 0 numaHost: VCPU 16 VPD 0 PPD 0 numaHost: VCPU 17 VPD 0 PPD 0 numaHost: VCPU 18 VPD 0 PPD 0 numaHost: VCPU 19 VPD 0 PPD 0 numaHost: VCPU 20 VPD 0 PPD 0 numaHost: VCPU 21 VPD 0 PPD 0 numaHost: VCPU 22 VPD 0 PPD 0 numaHost: VCPU 23 VPD 0 PPD 0 2105058 2105058 U vmx-vcpu-0:DVDStore_ 51.388 WAIT 13.329 0.000 IDLE 41.470 41.219 0.016 0 -1 pct 24000 vm.2105025 16390 35 0 1 28-55 2105060 2105058 U vmx-vcpu-1:DVDStore_ 51.386 WAIT 0.408 0.000 IDLE 50.988 50.561 0.015 0 -1 pct 24000 vm.2105025 16390 45 0 1 28-55 2105061 2105058 U vmx-vcpu-2:DVDStore_ 51.386 WAIT 0.254 0.000 IDLE 51.123 50.246 0.014 0 -1 pct 24000 vm.2105025 16390 41 0 1 28-55 2105062 2105058 U vmx-vcpu-3:DVDStore_ 51.386 WAIT 0.691 0.000 IDLE 50.772 49.894 0.015 0 -1 pct 24000 vm.2105025 16390 55 0 1 28-55 2105063 2105058 U vmx-vcpu-4:DVDStore_ 51.385 WAIT 1.461 0.000 IDLE 50.190 49.315 0.008 0 -1 pct 24000 vm.2105025 16390 31 0 1 28-55 2105064 2105058 U vmx-vcpu-5:DVDStore_ 51.385 WAIT 0.707 0.000 IDLE 50.758 49.885 0.011 0 -1 pct 24000 vm.2105025 16390 45 0 1 28-55 2105065 2105058 U vmx-vcpu-6:DVDStore_ 51.385 WAIT 0.905 0.000 IDLE 50.603 49.733 0.016 0 -1 pct 24000 vm.2105025 16390 42 0 1 28-55 2105066 2105058 U vmx-vcpu-7:DVDStore_ 51.385 WAIT 0.309 0.000 IDLE 51.063 50.580 0.012 0 -1 pct 24000 vm.2105025 16390 53 0 1 28-55 2105067 2105058 U vmx-vcpu-8:DVDStore_ 51.385 WAIT 1.005 0.000 IDLE 50.503 49.633 0.012 0 -1 pct 24000 vm.2105025 16390 50 0 1 28-55 2105068 2105058 U vmx-vcpu-9:DVDStore_ 51.385 WAIT 1.967 0.000 IDLE 49.714 48.847 0.004 0 -1 pct 24000 vm.2105025 16390 46 0 1 28-55 2105069 2105058 U vmx-vcpu-10:DVDStore 51.384 WAIT 2.243 0.000 IDLE 49.522 48.651 0.007 0 -1 pct 24000 vm.2105025 16390 34 0 1 28-55 2105070 2105058 U vmx-vcpu-11:DVDStore 51.384 WAIT 1.805 0.000 IDLE 49.861 48.990 0.007 0 -1 pct 24000 vm.2105025 16390 42 0 1 28-55 2105071 2105058 U vmx-vcpu-12:DVDStore 51.384 WAIT 1.794 0.000 IDLE 49.846 49.365 0.011 0 -1 pct 24000 vm.2105025 16390 28 0 1 28-55 2105072 2105058 U vmx-vcpu-13:DVDStore 51.384 WAIT 1.758 0.000 IDLE 49.844 48.977 0.007 0 -1 pct 24000 vm.2105025 16390 33 0 1 28-55 2105073 2105058 U vmx-vcpu-14:DVDStore 51.384 WAIT 1.691 0.000 IDLE 49.874 49.000 0.007 0 -1 pct 24000 vm.2105025 16390 41 0 1 28-55 2105074 2105058 U vmx-vcpu-15:DVDStore 51.384 WAIT 1.810 0.000 IDLE 49.846 48.973 0.008 0 -1 pct 24000 vm.2105025 16390 29 0 1 28-55 2105075 2105058 U vmx-vcpu-16:DVDStore 51.384 WAIT 1.787 0.000 IDLE 49.830 48.954 0.008 0 -1 pct 24000 vm.2105025 16390 38 0 1 28-55 2105076 2105058 U vmx-vcpu-17:DVDStore 51.383 WAIT 2.116 0.000 IDLE 49.616 48.738 0.007 0 -1 pct 24000 vm.2105025 16390 30 0 1 28-55 2105077 2105058 U vmx-vcpu-18:DVDStore 51.383 WAIT 1.802 0.000 IDLE 49.870 48.998 0.005 0 -1 pct 24000 vm.2105025 16390 29 0 1 28-55 2105078 2105058 U vmx-vcpu-19:DVDStore 51.383 WAIT 2.578 0.000 IDLE 49.286 48.399 0.008 0 -1 pct 24000 vm.2105025 16390 37 0 1 28-55 2105079 2105058 U vmx-vcpu-20:DVDStore 51.383 WAIT 3.524 0.000 IDLE 48.506 47.655 0.008 0 -1 pct 24000 vm.2105025 16390 34 0 1 28-55 2105080 2105058 U vmx-vcpu-21:DVDStore 51.383 WAIT 0.340 0.000 IDLE 51.049 50.176 0.012 0 -1 pct 24000 vm.2105025 16390 55 0 1 28-55 2105081 2105058 U vmx-vcpu-22:DVDStore 51.382 WAIT 0.240 0.000 IDLE 51.113 50.238 0.012 0 -1 pct 24000 vm.2105025 16390 48 0 1 28-55 2105082 2105058 U vmx-vcpu-23:DVDStore 51.382 WAIT 1.589 0.000 IDLE 50.029 49.158 0.009 0 -1 pct 24000 vm.2105025 16390 33 0 1 28-55
ESXTOP
해당 옵션을 주게 되면 24 vCPU 가 vNUMA 가 동작하여 양쪽 소켓으로 분배되지 않고 한쪽에서 처리가 되도록 변경이 됩니다.
물론 이때에는 CPU 뿐만 아니라 메모리에 대한 사이징도 NUMA 노드를 넘어가지 않도록 사이징을 해야합니다.
PreferHT 옵션을 사용하게 되면 한쪽 NUMA 의 CPU 경합(Ready 등) 이 상승하게 됨으로 그 부분은 참고를 하셔야 합니다.
위의 환경에서 28 vCPU 를 할당하고 preferHT 를 주더라도 14 vCPU VM 의 2배 성능이 나오는것은 아니라는 것이지요. 다만 L3 캐시 히트율이나 리모트 메모리 액세스에 의한 성능저하에 민감한 어플리케이션이라면 이점이 있을 수 있습니다.
요약하면
- ESXi 에서는 VM 에 Hyper Threaded core 를 노출시킬 수 없다.
- preferHT 옵션은 VM 에 Hyper-Threaded core 를 노출시키기 위함이 아닌 NUMA Topology 를 조절할 때 쓰는 option 이다.
- workload 에 따라 preferHT 옵션이 성능에 도움이 될 수 있다. (디폴트는 off)
- preferHT 옵션 사용시 VM 사이징은 단일 NUMA 노드안에 들어올 수 있도록 해야한다.
참고 링크
https://blogs.vmware.com/vsphere/2014/03/perferht-use-2.html
https://kb.vmware.com/s/article/2003582