프로세서가 워크로드를 실행할 때 관측되는 온도 변화에 따라 위 그림과 같이 유지(Sustain), 상승(Attack), 하강(Decay)의 세가지 상태로 구분할 수 있다. 각 상태별 열적 상태는 아래 그림과 같이 설명될 수 있다. 상승 상태에서는 프로세서에서 냉각 가능한 열량 보다 더 많은 열을 방출하는 경우, 유지 단계에서는 동일한 양의 열을, 하강 단계에서는 적을 열을 방출한다.
이때 냉각 가능 열량은 프로세서의 온도와 주변 온도와의 차이에 비례한다. 이 냉각 가능 열량 유지 단계에서의 전력과 온도 측정 데이터를 수집하여 계산할 수 있다. 어떤 시점에서 온도와 전력을 안다면 해당 온도에 대한 냉각 용량을 알 수 있으며, 이 값을 소모 전력에서 빼면 온도 상승에 영향을 주는 열량을 파악할 수 있다. 온도 변화에 영향을 주는 열량과 온도 변화 사이의 관계를 관측하면 온도-전력 비례 계수 또한 계산 할 수 있다. 이 두가지 정보를 활용하면 다음 시점의 온도를 예측하는것이 가능해진다.
위 그림은 냉각 가능 용량과 온도-전력 비례 계수를 사용하여 온도 예측이 어떻게 이루어질 수 있는지 보여주는 그림이다. 두 값을 통해 짧은 시간 이후의 온도를 예측하고 예측된 온도 값을 이용하여 그 이후의 값을 예측하는 방식이다. 이때 워크로드가 소모하는 전력 소모 특징은 변하지 않는 다고 가정하고, 온도 증가에 따른 누수 전력의 변화를 고려하여 해당 시점의 전력 소모량을 예측한다.
이러한 온도 예측 기술을 활용하면 매우 낮은 오버헤드만으로 실시간으로 온도 변화를 예측하고, 급격한 온도 변화에 대비하는 것이 가능하다
프로세서의 온도 관리는 프로세서가 고온에서 동작하면서 발생할 수 있는 고장과 신뢰성 저하로 부터 프로세서를 보호하는 것을 최우선으로 고려하기 때문에 실행중이 워크로드에 대한 고려 없이 온도가 정해진 값 이상으로 올라갈 경우 강제적으로 소모 전력과 성능을 줄인다. 이러한 강제적 온도 관리는 다양한 우선 순위의 태스크가 동시에 실행되는 시스템에서 우선 순위가 높은 워크로드가 우선 순위가 낮은 워크로드로 인해 성능에 영향을 받는 문제가 생길 수 있다.
위 그림은 온도로 인해 우선순위가 높은 태스크가 영향을 받는 상황을 설명하는 그림이다. 우선 순위가 높지 않은 워크로드가 온도 상한(Trip point)를 넘지 않도록 프로세서를 사용하는 상황에서 높은 성능을 요구하며, 자원 사용 밀도가 높은 워크로드가 새롭게 시작하였을 때 시간의 흐름에 따라 프로세서의 온도의 변화를 나타내었다. High performance burst란 자원을 밀도있게 사용하며 높은 성능을 요구하는 워크로드가 실행된 상황을 의미한다. 새롭게 시작된 워크로드는 프로세서의 온도가 상한점 이상으로 상승 시킬 수 있다. 온도가 올라가면 프로세서는 강제적으로 성능을 저하시키게 되므로 높은 우선 순위의 워크로드는 낮은 성능에서 실행되게 된다.
이러한 문제를 해결하기 위해서 본 과제에서는 우선 순위 따라 온도 상한을 다르게 주는 Thermal Margin Preservation(TMP) 기법을 제안하였다. Thermal Margin은 프로세서의 온도 상한점 보다 낮은 온도로 유지하여 갑자기 시작된 다른 워크로드가 온도를 상승 시킬 여지를 남겨 둔다는 의미로 결정된 명칭이다.
아래 그림은 우선 순위에 따라 상한온도를 다르게 설정할 경우 위에서 설명된 문제가 어떻게 해결되는 지를 보여준다. 시스템은 우선순위가 낮은 응용을 실행하는 동안은 하드웨어적 온도 상한점에서 정해진 마진을 남겨둔 온도를 새로운 온도 상한으로 설정하게된다. 이때 우선순위가 높은 응용이 새롭게 시작되면, 온도 상한을 재설정하여 온도를 더 높일 수 있는 여지를 제공한다. 따라서 워크로드는 요구되는 높은 성능을 보장받으면서 실행될 수 있게 된다.
우선 순위가 낮은 워크로드의 경우 자유롭게 온도를 높일 수 있던 기존의 방법 보다는 더 느리게 실행될 수 있지만, 우선 순위가 높은 워크로드의 성능이 보장하는 것이 가능하다. 또한 우선 순위별로 제공가능한 최대 성능이 차등화 되고 워크로드간 불필요한 성능 간섭을 줄일 수 있기 때문에 성능 예측과 서비스 품질 보장이 요구되는 시스템에 필요한 기술이다.
대규모 컴퓨팅 시스템을 구성하고 운영할 때 비용 및 환경적 측면에서 에너지 소모를 줄이는 것은 매우 중요한 과제이다. 컴퓨터를 운영하기 위해 소모하는 에너지 비용을 줄이는것을 목적으로 하는 기술은 모두 enegy-efficient computing으로 구분할 수 있다. 시스템의 비용 효율을 높이는 것을 목적으로 하기 때문에 전력 소모를 줄이기 위해 과도한 성능 저하를 유발하거나, 전체 비용이 증가하는 것을 허용하지 않으며, 시스템은 늘 안전한 상황에 있다고 가정하고 있으므로, 위에서 설명한 전력 관리 기술과는 그 맥을 달리한다.
최근 에너지 효율성을 개선하기 위한 연구는 워크로드가 실행과 관련된 에너지 소비를 줄이는 기술과, 여러 단계로 구분된 Idle 상태를 활용하는 기술로 구분할 수 있다.
다수의 코어를 활용하여 병렬로 작업을 수행할 때 투입된 코어 수가 많아질수록 오버헤드가 커지면서 성능 증가의 폭도 줄어든다. 이 오버헤드를 발생시키는 주 원인은 동기화에서 찾아볼 수 있다. 그런데 동기화로 인해 직렬화된 구간은 전체 성능을 감소시키는 것 뿐만 아니라 에너지 낭비를 증가시키는 원인이 되기도 한다.
위 그림은 바쁜 대기 방식으로 동기화될 때 발생하는 오버헤드가 가장 커지는 경우에 에너지 낭비가 얼마나 심각해질 수 있는지를 설명하고 있다. 그림은 4개의 태스크가 각각 세로축의 높이만큼 전력을 소모하면서 실행되다가 동시에 임계 영역에 접근하는 경우를 보여주고 있다.
임계 영역의 길이가 t라면 마지막에 락을 얻게되는 태스크는 3t 만큼 기다려야한다. 바쁜 대기를 사용하고 있기 때문에 락을 기다리는 태스크들이 소모하는 전력은 작업 수행에 도움이 되지 않은 낭비이며, 이 예시에서 낭비되는 에너지는 6t에 달한다. 동시에 임계영역에 접근하는 태스크가 많을수록 이 낭비는 기하급수적으로 늘어날 수 있다.
이러한 낭비는 그림의 오른쪽과 같이 대기하는 태스크들을 유휴 상태 (Idle state)로 보내거나 태스크를 재우는 것으로 줄일 수 있다. 기존의 Blocking 방식의 동기화의 경우 기다리는 태스크를 sleep 상태로 변경하여 자원 낭비를 막고있지만, 바쁜 대기에 비해 오버헤드가 크고 실제로 sleep 상태가 되기 까지 상당한 딜레이가 필요하기 때문에 임계 영역의 길이가 충분하지 않은 경우에 성능 저하를 크게 발생시킬 수 있다. 따라서 바쁜 대기의 형태를 그대로 유지하면서 대기 태스크들이 전력을 덜 소모하도록 만드는 기법이 필요하다.
리눅스 커널에서 스핀락은 매니코어 환경에서 확장성 (Scalability)을 제공하기 위해 MCS 락의 변형인 큐-스핀락 (Queued spinlock)을 사용한다. 큐-스핀락에서 대기 태스크는 전용의 노드에 대해서 spinning 하면서 차례를 기다린다. 따라서 다수의 태스크가 1개의 변수를 반복적으로 확인하면서 발생할 수 있는 캐시와 버스, 메모리 등에 발생하는 경쟁 문제를 근본적으로 해결할 수 있다. 그로 인해 리눅스 커널은 수십 개의 코어를 가진 시스템에서 합리적인 확장성을 제공하는 것이 가능해졌다. 하지만 대기 태스크들은 더 원활하게 spinning 할 수 있게 되었고, 대기 태스크의 전력 낭비 문제는 그대로 남겨져있다.
본 연구진은 리눅스 커널의 에너지 효율성을 개선하기 위해 Catnap 스핀락을 개발하였다. Catnap 스핀락은 대기 중인 태스크가 코어를 유휴 상태로 변경한 후 대기한다. 스케쥴 아웃되지 않으므로 깨어나는데 걸리는 시간이 비교적 짧으면서 대기중에 코어가 저전력 모드로 들어가게 되므로 전력 소모가 줄어든다. 또한, 하이퍼쓰레딩 구조와 결합하여 자원 활용율을 높이는데 도움을 준다. 매니코어 환경에서 리눅스 커널에 Catnap 스핀락 기술을 적용하였을때 AIM7 벤치마크의 에너지 소모가 10.17%~10.75% 절감되는것을 확인하였다.
polling은 프로그램이나 장치들이 어떤 상태에 있는지를 주기적으로 확인하고 사용 가능한 시점이 되면 요청을 처리하도록 하는 기법이다. polling은 장치의 상태가 변할 때 발생하는 신호를 통해 깨어나서 요청을 처리하는 인터럽트와는 달리 주기적으로 깨어나 상태를 확인하는 연산을 수행하기 때문에 요청 지연 시간이 길어지면 길어질수록 더 많은 연산을 수행하게 된다. 이러한 단점에도 불구하고, 인터럽트에 비해 빠른 응답시간 빠르고 대역폭이 큰 장치를 지원하기에 적합하기 때문에 네크워크 통신의 처리는 polling 기법을 활용하여 구현된다.
매니코어 환경에서는 코어들이 동시에 네크워크 통신을 사용할 때 매우 쉽게 contention이 관측될 수 있는데, 그때 각 코어가 polling을 수행하고 있다면, 전체 프로세서의 관점에서는 매우 많은 자원이 불필요하게 소모되는 문제가 발생할 수 있다. 아래의 왼쪽 그림은 네트워크에서 경쟁이 발생했을때 각 코어의 지연시간이 증가하면서 늘어날 불필요한 에너지 소모를 보이고자 하였다. 이때 polling 주기가 길어져서 대기 중에 적게 깨어날 수 있다면, 성능 저하 없이 이러한 불필요한 에너지 소모를 줄이는 것이 가능할 것이다. Energy efficient polling은 커널 안에서 contention을 관측하여 polling 주기를 동적으로 조절 하는 기술이다.
전력 캡핑(power-capping)은 평균 전력 소모를 허용량 이하로 유지시키는 기술로, 데이터 센터의 전력 집적도를 높여 전력 공급 비용을 절감할 수 있게 해준다. 단일 서버 수준의 전력 캡핑 기술은 전력 공급 장치에 과부하가 걸릴 가능성을 제거하여 유연한 전력 관리 시스템을 구축하는 것을 가능하게 한다. 특히 매니코어(manycore) 시스템은 단일 시스템 수준에서도 전력 집적도가 높으며 평균 전력 소모가 큰 고성능 워크로드를 위해 주로 사용되므로 전력 캡핑 기술의 중요성이 더욱 크다고 할 수 있다.
매니코어에서 정밀하게 전력 소모를 제어하여 가용 범위 내에서 성능을 최대한 제공하기 위해서 idle injection 기법을 활용한 전력 캐핑 기술에대한 연구를 진행하였다. 전력 캡핑을 구현하기 위해서는 전력 절감이 요구될 때 전력 소모를 즉각적으로 변화시킬 수 있어야 하는데, 이를 위해서는 요구되는 성능 수준까지 단번에 할 수 있어야한다. 이러한 두가지 요구를 만족시키기 위해서는 현재 전력 사용량을 기반으로 적절한 유휴 전력을 계산해주는 동적 전력 모델이 필요하다.
유휴 삽입이 코어의 상태를 변경하여 전력 소모를 낮추겠지만, 그 양과 관계를 정확히 파악하지 못한다면 목표로 하는 전력의 상한 값에 맞출 수 없다. 전력 제한으로 인해 전력 소모를 강제적으로 줄여야 할 때, 허용된 범위안에서는 성능을 최대한 사용할 수 있도록 하기 위해서 적절한 유휴 삽입 비율을 계산하는데 사용할 전력 모델을 설계하였다. 전력 모델을 설계하기 위해서 유휴 삽입을 수행하면서 유휴 비율이 전력 소모에 미치는 영향을 실험적으로 파악하고 두가지 측정 데이터 사이의 관계를 정의하였다.
위 수식에서 I는 유휴 상태 비율, Pc는 현재의 전력, Pw는 원하는 전력의 상한선, S는 시스템의 정적 전력을 나타낸다. 이 모델을 통하여 전력 소모가 한계를 초과한 경우 목표로 하는 전력량에 맞추어 전력 소모를 줄이기 위해서 삽입해야 할 유휴 비율을 계산할 수 있다.
리눅스 커널을 위한 전력 상한제한 모듈을 구현하고 전력 모델의 정확도를 평가하였다. 구현된 전력 캐핑 모듈은 W 단위로 전력 상한을 지정할 수 있으며, 주기적으로 소모 전력과 전력 상한을 비교하여 전력 모델을 통해 적정 수준의 유휴 삽입을 자동으로 수행한다. 아래 그림은 우리가 개발한 모듈의 구조를 보여주고 있다.
구현한 유휴 삽입에 기반한 전력 캡핑 모듈이 매니코어 시스템 환경에서 잘 동작하는지를 확인하기 위해 KNL 실험 환경에서 테스트를 진행하였다. NPB의 BT 워크로드를 256개의 쓰레드로 돌려 실험 결과를 하였으며, BT는 전력 캡핑을 하지 않은 상태에서는 평균 209.03W의 전력으로 동작한다.
위 그림에서처럼 170 W의 전력 캡핑을 적용하면 평균 전력은 165.41 W 로 전력 모델을 2.77 % 오차 이내로 전력 소모를 조절할 수 있다. 1초 단위로 평균 전력을 측정하였을 때, 샘플링 된 전체 데이터 중 2.12 %가 지정된 상한 전력을 초과하는 것으로 나타났다. 하지만 초과된 전력의 최대값은 상한 값의 0.29 %로 전력 상한 제한 기능을 적절하게 제공될 수 있음을 보였다.
전력 제한을 150 W로 지정하였을 때는 전력 상한을 초과하는 경우가 전체의 16.07 %이며, 최대 값도 2.33 %로 더 커진다. 그러나 측정된 평균 전력은 146.67 W로 전력 모델은 필요한 유휴 삽입 비율을 적절하게 계산하고 있다고 평가할 수 있다. 만약 150 W와 같은 상황에서 더 엄격한 전력 상한 제한을 구현하고자 한다면, 목표 전력을 좀 더 낮게 잡도록 여유를 주는 것과 모듈의 동작 주기를 짧게 하는 것으로 전력이 초과되는 문제를 해결할 수 있다.