intel_pstate 드라이버를 사용한 배터리 성능이 형편없습니다

intel_pstate 드라이버를 사용한 배터리 성능이 형편없습니다

편집기: Ubuntu(mate) 20.04, intel_pstate 드라이버. 제가 사용하는 컴퓨터는 Intel Core i7 i7-8565U가 탑재된 Razer Blade Stealth Ultrabook(2019년 초)입니다.

TLP를 AC 모드로 설정해도 배터리 전원만으로 실행할 때 이상한 동작(심각한 속도 저하)이 발생합니다. CPUfrequtils를 성능 모드(특히 멀티스레드)로 설정하면 문제가 더욱 악화됩니다!

단일 스레드 사례(즉, 메인 스레드만 해당)부터 시작하겠습니다. 웹캠의 파일이나 비디오 프레임에 일련의 OPENCV 필터(가우시안 블러 등)를 실행하고 있습니다. 모든 프레임을 메모리에 먼저 로드해도 상관없습니다(즉, 디스크나 장치 I/O 문제가 아님). 단일 사이클(한 프레임)에 대한 처리 시간은 다음과 같습니다. 이것은 복잡한 코드가 아닙니다. 기본적으로 다음을 수행합니다.

Filter filters[400]
while( cap.read(frame) )
{
 for( int i=0; i<400; ++i )
 {
  filters[i].dofilter(frame);
 }
}

여기서 필터[i].dofilter는 cv::GaussianBlur, resize() 등을 호출하고 대상 cv::Mat를 사전 할당합니다(추가 할당은 수행하지 않습니다).

이는 CPU만 사용합니다(즉, OPENCV 투명 openCL 등을 사용하지 않습니다).

단일 스레드

AC  + powersave:    71 msec (variance 70.5-71.5)
AC  + performance:  67 msec (variance 66.5-67.5)
BAT + powersave:    95 msec (variance 84.0-115.0)  *1
BAT + performance:  104 msec (variance 76.0-202.0) *2

1* Note: spikes to 110+ about every 5 sec
2* Note:  most ~96, with few spikes low to 80s and high to 120s

방법: 60초 동안 각 조건을 10회 실행(10회 실행당 ~600프레임 = 6000), 무작위로 주문합니다(열, 배터리 전압 등이 섞이지 않도록).

나는 사용한다동일한 입력 프레임각 루프마다(즉, 매번 처리되는 이미지 내용이 다르기 때문이 아닙니다). 실제로 모든 시간 단계에서 정확히 동일한 입력을 처리합니다. AC 어댑터를 뽑거나 꽂거나 cpufrequtils를 사용하여 절전/성능을 설정하면 프레임당 처리 시간이 변경되는 것을 즉시 확인할 수 있습니다.

나는 완전히 압도당했습니다.

저는 Intel Core i7 i7-8565U와 함께 Razer Blade Stealth 울트라북을 사용하고 있습니다. Ubuntu(mate) 20.04, intel_pstate 드라이버.

그래서 세 가지 구체적인 질문이 있습니다.

1) 정확히 무슨 일이 일어났나요?

2) TLP(커널 매개변수?)를 AC에 있는 것처럼 강제로 설정하려면 어떻게 해야 합니까?(물론 배터리는 CPU/메모리 바인딩된 단일 코어 프로그램을 AC에 있는 것처럼 빠르게 실행하기에 충분한 전력을 제공할 수 있습니다) ? 그리고 그것은 아직 끝나지 않았습니다!

3) 배터리 전원 공급 장치에 비밀/이상한 설정이 있습니까? 특히 멀티스레딩과 관련이 있나요? 문제는 병렬성이 매우 높다는 것입니다. 기본적으로 병렬로 실행될 수 있는 8개의 독립적인 필터 체인이 있습니다. 보통 저는 이렇게 합니다. AC에서 이 작업을 수행하면 다음과 같은 일이 발생합니다.

멀티스레딩(8스레드)

AC  + powersave:    28.6 msec (variance 26.8-31.1)
AC  + performance:  28.8 msec (variance 26.6-31.2)
BAT + powersave:    39 msec (variance 36.0-64.0)   *3
BAT + performance:  176 msec (variance 39.0-202.0) *4

3* Note: this is very tame compared to if I run with webcam -- then it spikes heavily between 40 and 90

4* Note: will update at 40 msec for a few frames, then go to 180 msec for a long time, then burst at 40 for a few.

소프트웨어는 스레드 풀을 통해 멀티스레딩을 구현합니다. 잠금을 확인하고 극단적인 멀티스레딩 상황에서도 잠금을 기다리는 데 시간을 허비하지 않았습니다(처음에 그것이 문제라고 생각했기 때문에 실제로 가장 많은 시간을 보냈습니다...). 2~8개의 스레드를 사용해도 비슷한 결과를 얻었습니다. 배터리를 사용할 경우 스레드 수가 많을수록 속도가 느려지고(특히 성능 모드에서) AC를 사용할 경우 스레드 수가 많을수록 속도가 빨라집니다.

편집: TLP를 비활성화해도 문제가 발생합니다. 아직 기존 ACPI 주파수 조정기로 전환해 보지 않았습니다. (효과가 있을 것 같나요?)

편집 2: 단일 스레드 모드에서 htop은 고정된 CPU 코어만 표시합니다(즉, 벡터화하고 더 많은 코어를 사용하기 위해 openmp 또는 다른 것을 사용하지 않습니다).

답변1

문제는 intel_pstate 드라이버입니다.

부팅 커널 매개변수를 통해 원래 ACPI 드라이버로 전환했습니다. 특히 /etc/default/grub에서 DEFAULT 부팅 라인을 다음과 같이 변경했습니다.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_pstate=disable acpi=force"

( update-grub기억한 후).

이제 아무런 변경 없이도(즉, 기본 "ondemand"):

멀티스레딩(8스레드)

BAT + ondemand:     38.5 (37.5 ~ 40.0)
BAT + performance:  31.8 (30.1 ~ 35.0) *1

1* 몇 초마다 최대 35까지 매우 작은 스파이크가 표시되지만 이는 그럴 만한 이유가 있습니다...

아이러니하게도 일반적인 작업(브라우징, EMACS, Wi-Fi 등) 중 전력 소비는 실제로 intel_pstate(평균 590mA 대 660mA)를 사용하는 것보다 ACPI 드라이버를 사용하는 것이 더 좋습니다. 행복한(그러나 걱정스러운) 부작용.

편집: 한 가지 단점은 intel_pstate 드라이버를 사용하지 않을 때 일시 중단(절전 모드)이 더 많은 전력을 소비하는 것 같다는 것입니다. 12시간마다 10% 정도...

답변2

이것은 내 커널 make"다운 전용" 벤치마크입니다(즉, make할 일이 없을 때 - 몇 초).

make의 옵션을 인식하는 데 시간이 좀 걸렸 -j으며 Turbo-Boost 및 SMT/Hyperthreading 설정을 변경하기 위해 재부팅할 필요가 없습니다 /sys. .

내 TDP는 28W입니다. 노트북은 아니고 i5-8259U 입니다. 일반적으로 (지금처럼) 3.5W-5W를 소비합니다. 다음은 와트의 물리적 측정에 초점을 맞춰 기록한 결과 중 일부입니다.

time make -j10 -O O=../make-out/

TB+HT,mitigations=off

-j8:    4.8s    57W (max.)
-j4:   12.3s    20W (-35W)  
no-j:  21.7s    19W (max.)
-j4II:  6.4s    45W

줄(Joule)로 바꾸면 더 정확해집니다. 57W에는 팬이 포함되어 있는 것 같아요. 이 두 -j4결과는 총 에너지(Ws = Joules)가 어느 정도 일정하게 유지된다는 것을 보여줍니다.

TB no, HT yes
-j10:  7.7s  22W

내가 작성한 마지막 테스트는 다음과 같습니다.

TB 25-35-1sec "tau", HT yes, mitig.=off
-j10:  5.2s  40W

이 Turbo-Boost 설정은 BIOS에서 제공되며 "최대 57W"를 제한하는 데 도움이 되는 것 같습니다. 첫 번째 실행부터.

하지만 sysfs에 75(퍼센트)를 쓴 후 intel_pstate/max_perf_pct이제 더 나은 부스트 ​​방법을 찾았지만 3.8GHz가 아닌 3.0GHz까지만 가능합니다.

이제 35W(최대 44W)에서는 5.5초, 약 50W에서는 4.8초가 걸립니다. 부스트 없이 25W에서 6.7초.


더 많은 활성 코어와 더 높은 CPU 주파수를 통해거대한시간의 차이그리고 와트. GPU(귀하의 경우?)와 팬을 추가할 수도 있습니다.

배터리가 매우 빨리 소모된다는 것 외에는 배터리에 과전류 문제가 있는지 지금은 알 수 없습니다. 그러나 내 측정에 따르면 그 차이는 상당할 수 있으며 일반적으로 온도와 같은 몇 가지 제한 사항이 있을 수 있습니다.

하지만면도날 울트라북- 배터리 불량!

관련 정보