P-State란

  • P-State는 시스템이 동작하는 동안, CPU의 클럭 주파수를 조절하여 어느 정도의 Performance로 CPU를 작동시킬 것인지 결정
  • Intel의 X86 프로세서에서 P-State 기능을 SpeedStep이라는 이름으로 사용
  • 리눅스는 P-State 기능을 "/sys/devices/system/cpu/cpu#/cpufreq/" 에 존재하는 파일을 이용하여 조절
  • P-State는 시스템의 클럭수를 조절하여 동적으로 전체 시스템의 전력 소모를 조절
  • CPU P-State는 Performace 상태로 정의된 voltage-frequency 제어 상태를 나타냄
  • voltage-frequency 제어에서 회로를 구동하는 전압(voltage)과 클록(clock)은 작업 부하에 따라 증가하거나 감소함
  • 운영 체제는 현재 작업 부하(workload)를 기반으로 특정 P-State를 요청
  • 프로세서는 요청을 수락하거나 거부하고, 자체 상태를 기반으로 P-State를 설정 가능
  • P-State는 프로세서가 지원하는 frequency와 수집 기간 동안 각 frequency에서 소요된 시간을 나타냄
  • P-State에서는 SpeedStep, Speed Shift가 CPU의 클럭을 관리

 

P-State 핵심

  • P-State가 CPU frequency를 떨어뜨려서 전력 소모를 줄이는 방법
  • CPU 사용량이 적을때 CPU 코어의frequency를 떨어뜨려서 적은 voltage으로 CPU를 동작할 수 있게 하기 위해 사용
  • CPU 코어 frequency와 voltage를 미리 정의 → 요청사항이 많을 때는 최대 frequency로 설정, 요청사항이 적은 때는 낮은 frequency로 동작
  • Intel 계열 CPU에서는 SpeedStep이라는 이름을 사용

  • Linux 상에서 cpufreq라는 인터페이스를 통해서 SpeedStep 기능 제어 → CPU frequency governor는 cpufreq로 frequency 결정
    1. cpufreq_performance → 전력은 많이 소비하지만 항상 최대의 성능으로 동작
    2. cpufreq_powersave → 최대한 전력을 아끼는 방법으로 동작
    3. cpufreq_ondemand → 주파수의 범위를 정해주고 부하 상황에 맞게 가변적으로 동작

 

P-State(active) 상태의 전원 관리

1. 스피트스텝(SpeedStep)

  • 스피드 스텝 기술은 P-State를 제어하는 기술
  • 인텔에서 개발한 기술
  • CPU에 걸린 부하에 따라서 자동으로 클럭을 조절해주는 기술
  • 배터리 소모량을 유연하게 조절하여 사용시간을 늘려주는 장점이 있지만, 클럭 조정시에 일시적으로 버벅임이 발생 가능
  • SpeedStep의 주요 통제권은 OS가 가지고 있음

  • 스피트스텝(SpeedStep) 작동원리
    1. 오피스 소프트웨어 이용하여 문서작업 등 비교적 부하가 낮게 걸리는 작업에서 CPU의 속도를 고의로 낮추어 작동
    2. HD급 동영상 재생 등 부하가 심하게 걸리는 작업에서는 CPU의 속도를 낮추지않는 방식으로 작동

 

2. 스피드 쉬프트(Speed Shift)

  • 스카이레이크 마이크로 아키텍쳐를 가진 CPU 이후부터는 스피드 스텝을 하드웨어 단에 적용한 스피드 시프트 기술이 적용
  • 베이스 클럭에서부터 터보 부스트 영역까지 확장된 기술
  • 마이크로프로세서 안의 PCU(Power Control Unit)이라는 하드웨어가 밀리초 단위로 정해진 알고리즘에 따라 계산하면서 최적의 CPU 클럭과 전압으로 관리
  • 스피드 쉬프트 기술을 이용하려면 OS에서 지원을 해야 사용 가능
  • 스피드 시프트를 지원하지 않는 OS에서는 스피드 스텝으로 작동
  • Speed Shift는 Speedstep과 달리 OS가 CPU 제어권을 대부분 PCU1에 넘겨 CPU의 클럭을 유동적으로 조절
  • Speedstep과 비교하여 하드웨어적인 방식을 사용하기 때문에, CPU 클럭 제어 속도가 빨라졌고, 더욱 정밀한 클럭 계산이 가능해져 더 적은 에너지를 사용
  • Speedstep이 20~30ms에 걸쳐 최대 클럭을 올릴 때, SpeedShift는 5~7ms만에 최대 클럭까지 도달 → 최대 50% 더 빠른 변속을 보여줌
  • Speedstep과 Speed Shift는 동시에 적용 X

 

CPU frequency governor 이란

  • CPU는 여러 주파수에서 동작이 가능하도록 설계되어 있으나, 리눅스 커널 대부분의 cpufreq 드라이버들은 CPU를 하나의 주파수로 설정
  • CPU의 사용량이 많지 않으면 저속으로 많아지면 고속으로 동작할 필요가 있음
  • 동적 주파수 확장을 제공하기 위해서 타겟 주파수를 드라이버에 알려줄 것이 필요가 있음
  • CPU frequency governor는 CPUfreq policy내에서 무슨 주파수를 사용할 것인지 결정
  • CPUfreq policy는 주파수 제한과 사용될 governor로 구성
  • DB 서버에 CPUfreq policy가 활성화되어 있다면 CPU 주파수가 떨어질 때 쿼리 응답 속도가 갑자기 늘어난다던가 하는 이슈가 발생 가능

1. governor 종류

  1. Performance→ CPU를 최고 주파수로 설정
  2. Powersave→ CPU를 최저 주파수로 설정
  3. OnDemand→ 현재 사용량에 따라 CPU frequnecy를 설정. CPU는 주파수를 빠르게 변경할 능력이 필요

 

2. 현재 설정된 governors 확인

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
powersave

 

3. 사용가능한 설정

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance powersave

 

4. governors 변경 → /sys/devices/system/cpu/ -> cpu[n] n 수만큼 다 변경해야함

# 먼저 CPU 개수 확인
$ cat /proc/cpuinfo | grep -i "^processor"
processor       : 0
processor       : 1
processor       : 2
processor       : 3
processor       : 4
processor       : 5
processor       : 6
processor       : 7
processor       : 8
processor       : 9
processor       : 10
processor       : 11
processor       : 12
processor       : 13
processor       : 14
processor       : 15
processor       : 16
processor       : 17
processor       : 18
processor       : 19
processor       : 20
processor       : 21
processor       : 22
processor       : 23
processor       : 24
processor       : 25
processor       : 26
processor       : 27
processor       : 28
processor       : 29
processor       : 30
processor       : 31
processor       : 32
processor       : 33
processor       : 34
processor       : 35
processor       : 36
processor       : 37
processor       : 38
processor       : 39

$ echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
$ echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
$ echo performance > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
#.... 중략....
$ echo performance > /sys/devices/system/cpu/cpu39/cpufreq/scaling_governor

 

 

+ Recent posts