원래는 계획에 없었던 Part2 입니다.
문서를 추가하게 된 계기는 원래 몰랐던 내용을 새로 알게 된게 있어서 추가하게 되었습니다.
Part1 문서에서는 다른 클럭을 가진 호스트로 vMotion 을 하게 되면 해당 호스트의 CPU 성능을 따라 간다 라는 이야기였는데
다른 Clock 을 가진 호스트로 vMotion 을 해보고 나서 sysbench 등의 벤치툴을 돌려보면, 성능이 저하가 되는 케이스가 발생하는 것을 확인하였습니다.
sysbench 테스트 커맨드
cmd: sysbench –test=memory –memory-oper=read run
vMotion 하기전 sysbench 결과
HOST 1: Intel(R) Xeon(R) CPU D-1541 @ 2.10GHz
HOST 2: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz
– before vmotion(Host 1)
Total operations: 48344274 (4831707.50 per second)
47211.21 MiB transferred (4718.46 MiB/sec)
– vmotion (HOST 1 -> HOST 2)
8373.77 MiB transferred (837.05 MiB/sec)
– 원복(기존 host로 migration) HOST 2 -> HOST 1
Total operations: 48121079 (4810336.29 per second)
46993.24 MiB transferred (4697.59 MiB/sec)
– 다시 migration (HOST 1 -> HOST 2)
Total operations: 8680004 (867587.68 per second)
8476.57 MiB transferred (847.25 MiB/sec)
– OS reboot (HOST 2)
Total operations: 8331377 (832718.89 per second)
8136.11 MiB transferred (813.20 MiB/sec)
– VM power off / on (HOST 2)
Total operations: 55282571 (5525684.05 per second)
53986.89 MiB transferred (5396.18 MiB/sec)
– vmotion (HOST 2 -> HOST 1)
2021-03-22 11:10
Total operations: 7155269 (715322.79 per second)
6987.57 MiB transferred (698.56 MiB/sec)
보시면 알겠지만, 붉은색은 성능이 잘 나오는 경우, 파란색은 성능이 안나오는 경우 입니다.
일반적으로는 vMotion 을 하더라도 물리적인 요소를 제외하고는 성능저하가 되는 경우가 거의 없긴 합니다만, 이러한 경우도 발생하는 것을 이번에 알게 되었습니다.
내용을 정리해보면, 원인은 CPU 의 RDTSC 라는 기능으로 인한 부분입니다.
RDTSC 는 (Read Time-Stamp Counter) 라는 부분이고, 이것은 OS 에서 실제 물리 CPU 의 Clock speed 를 확인하는 용도로 사용됩니다. 그런데 가상화 환경에서는 VM 마다 모두 RDTSC 기능을 활용하게 되면 오버헤드가 많이 걸리기 때문에, 이 부분을 해결하기 위해서 RDTSC offset 이라는 기능을 사용하게 됩니다.
이 때 vMotion 을 다른 Clock speed 를 가지고 있는 호스트로 하게 되면 이러한 RDTSC offset 을 사용할 수 없는 상황이 되고, RDTSC 콜로 인한 오버헤드가 많이 발생하게 되어 생기는 이슈입니다.
그래서 VM power off / on 을 통해서 RDTSC offset 이 Enable 되게 되면 성능이 다시 원래대로 나오는 경우라고 보시면 되겠습니다.
TSC 관련 logsnip (6.5 기준)
– vMotion 하는 동안 아래와 같이 TSC offset 이 disable 됌.
vmware.log:2021-03-09T04:17:33.235Z| vmx| I125: TSC offsetting enabled.
vmware.log:2021-03-09T04:17:33.254Z| vmx| I125: Disabling TSC scaling since host does not support it.
vmware.log:2021-03-09T04:17:33.254Z| vmx| I125: Disabling TSC offsetting since TSC rates differ: 2197455000 (guest) vs 2596992000 (host)
vmware.log:2021-03-09T04:17:33.269Z| vmx| I125: Capability Found: cpuid.RDTSCP = 0x1
해당 호스트는 Broadwell or Haswell 이기 떄문에 TSC scaling 을 지원하지 않는다 라는 메세지가 발생하게 됩니다.
Intel 의 경우 Skylake 부터는 RDTSC Scaling 이라는 기능이 생겨서 이러한 이슈 발생을 피할 수 있으며, AMD 의 경우 Opteron 부터 RDTSC scaling 을 지원한다고 하네요.
즉 Skylake 이전 세대 CPU 에서는 발생할 수 있는 부분이라고 보시면 됩니다.
참고로 RDTSC 를 적극적으로 활용하지 않는 어플리케이션들은 크게 영향받지 않으나 RDTSC 콜을 많이 하는 어플리케이션이나 연산을 많이 하는 어플리케이션에 대해서는 영향이 발생할 수 있는 부분이라고 합니다.
여기서 한가지 배울 수 있는 부분은,
Cluster 는 가급적이면 동일한 사양의 호스트로 구성하는 것이 좋다 라는 부분이겠지요.
깊이 있는 분석과 글 감사합니다.
참고하겠습니다.
잘 지내시죠?