2024년 5월 14일 화요일

CPU foldig에 대하여 (vpm_fold_policy)

 CPU folding shared processor LPAR, micro-partition에서 주로 사용하는 것인데, 당장의 workload에 비해 virtual CPU 개수가 너무 많으면 공연히 불필요한 context switching만 늘어나서, 당장 사용되지 않는 CPU 자원을 다른 LPAR들이 가져다 쓰는 것을 방해하므로, virtual CPU 개수를 그대로 놔두면서도 schedulding에서만 제외시키는 기법입니다.  이렇게 하면 fold CPU 자원을 다른 LPAR들이 더 효율적으로 가져다 쓸 수 있게 됩니다.   

Dedicated LPAR에서도 Power Savig Mode가 “Static Power Saving”으로 enable 되어 있는 경우 CPU folding이 사용됩니다.


vpm_fold_policy=4 disables processor folding in all conditions.

vpm_fold_policy=0 disables processor folding when vpm_xvcpus=-1

vpm_fold_policy=1 enables processor folding in shared partition.

vpm_fold_policy=2 enables processor folding in dedicated partition.

vpm_fold_policy=3 enables processor folding in both shared and dedicated partitions.


경우에 따라 성능을 위해 CPU folding을 disable하는 것이 더 유리할 수도 있습니다.  아래 간단한 테스트를 통해 그 효과를 보시겠습니다.


테스트를 수행할 LPAR는 shared processor를 사용하되 vCPU는 8개이고, EC (entitleed capacity)는 0.8개인 Power8 서버입니다.    관찰의 편의를 위해 SMT는 4개를 사용하는 것으로 설정했습니다.


aix7200-05-04:/ > lparstat -i

Node Name                                  : aix7200-05-04

Partition Name                             : AIX7200_05_04

Partition Number                           : 5

Type                                       : Shared-SMT-4

Mode                                       : Uncapped

Entitled Capacity                          : 0.80

Partition Group-ID                         : 32773

Shared Pool ID                             : 0

Online Virtual CPUs                        : 8

Maximum Virtual CPUs                       : 8

Minimum Virtual CPUs                       : 1

Online Memory                              : 4096 MB

Maximum Memory                             : 8192 MB

Minimum Memory                             : 4096 MB

Variable Capacity Weight                   : 128

Minimum Capacity                           : 0.10

Maximum Capacity                           : 2.00

Capacity Increment                         : 0.01

Maximum Physical CPUs in system            : 24

Active Physical CPUs in system             : 24

Active CPUs in Pool                        : 24

Shared Physical CPUs in system             : 24

Maximum Capacity of Pool                   : 2400

Entitled Capacity of Pool                  : 350

Unallocated Capacity                       : 0.00

Physical CPU Percentage                    : 10.00%

Unallocated Weight                         : 0

Memory Mode                                : Dedicated

Total I/O Memory Entitlement               : -

Variable Memory Capacity Weight            : -

Memory Pool ID                             : -

Physical Memory in the Pool                : -

Hypervisor Page Size                       : -

Unallocated Variable Memory Capacity Weight: -

Unallocated I/O Memory entitlement         : -

Memory Group ID of LPAR                    : -

Desired Virtual CPUs                       : 8

Desired Memory                             : 4096 MB

Desired Variable Capacity Weight           : 128

Desired Capacity                           : 0.80

Target Memory Expansion Factor             : -

Target Memory Expansion Size               : -

Power Saving Mode                          : Dynamic Power Savings (Favor Performance)

Sub Processor Mode                         : -



여기서 CPU 에 부하를 주기 위해서는 netperf를 이용했습니다.  다음과 같이 2개 process를 background로 동시에 구동했습니다.

aix7200-05-04:/ > netperf -l 30 -t TCP_RR -H 10.10.14.86 &  
aix7200-05-04:/ > netperf -l 30 -t TCP_RR -H 10.10.14.86 &  


먼저 default 상태인 CPU folding ON 상태로 테스트를 해보겠습니다.

aix7200-05-04:/ > schedo -o vpm_fold_policy=1


이렇게 ON 상태에서 부하를 걸어주면 다음과 같이 EC는 124.9%를 쓰면서 명목상의 CPU 사용률은 비교적 높게 나옵니다.  즉, 명목상의 idle%가 41.2%로 나옵니다.   이는 hypervisor가 판단하기에, 이 정도의 부하는 SMT thread 5개만 있어도 충분하다고 판단하여 전체 8 vCPU * 4 SMT thread = 32개 thread 중 17개를 fold 시켜 버린 것입니다.    

(실제로는 32개 thread가 필요에 따라 켜졌다 꺼졌다 하므로, nmon을 띄워놓고 보면 계속 끊임 없이 전체 CPU 개수가 32개와 5개 사이를 오가며 화면이 전환됩니다.)

아래 nmon 화면의 TOP process 부분을  자세히 보면  netperf 및 netserver process들이 총 4개가 떠있는데, 개당 대략 12%씩의 CPU를 사용하므로 CPU 1개의 45% 정도를 사용하는 셈입니다.



(확대해서 보려면 그림을 click하세요)


이어서 CPU folding을 OFF 시킨 상태로 테스트를 해보겠습니다.

aix7200-05-04:/ > schedo -o vpm_fold_policy=4


이렇게 OFF 상태에서 부하를 걸어주면 다음과 같이 EC는 238.4%를 쓰면서 명목상의 CPU 사용률은 비교적 낮게 나옵니다.  즉, 명목상의 idle%가 68.5%로 나옵니다.   이는 CPU folding을 하지 않으므로, 전체 8 vCPU * 4 SMT thread = 32개 thread가 모두 살아있고, 또 그만큼 많은 physical CPU 자원을 이 LPAR가 쥐고 있기 때문입니다.    


(확대해서 보려면 그림을 click하세요)


성능은 당연히 더 많은 physical CPU 자원을 사용하는 CPU folding OFF 상황이 더 좋게 나옵니다.

그러니 CPU folding은 OFF 시키는 것이 유리할까요?  꼭 그렇지는 않습니다.  원래 shared processor LPAR의 장점은 한정된 CPU 자원을 여러 LPAR들이 실시간으로 나누어 쓰며 CPU 자원의 활용율을 극대화하는 것인데, 이렇게 CPU folding을 OFF 시키면 이 LPAR가 CPU 자원을 더 많이 쓰는 만큼, 같은 box 내의 다른 LPAR들이 CPU 자원을 효율적으로 끌어다 쓰지 못하기 때문입니다.   

물론 CPU folding을 OFF 시킨다고 해서 CPU 자원 공유가 전혀 안 되는 것은 아닙니다.  다만 그만큼 자원 공유의 효율성이 떨어지게 되는 것은 사실입니다.  가령 저 위의 예에서 EC를 238.4%나 끌어다 쓰면서도 명목상의 CPU idle이 68.5%로 나오는 것이 그것을 보여줍니다.

결론적으로, 어느 특정 LPAR의 성능이 매우 중요하여, CPU 자원 공유의 효율이 떨어지더라도 성능을 더 높이고 싶은 경우에는 CPU folding을 OFF 시키는 것이 좋을 수 있습니다.