kworker 스레드 kacpid_notify/kacpid가 CPU의 60-70%를 차지합니다.

kworker 스레드 kacpid_notify/kacpid가 CPU의 60-70%를 차지합니다.

저는 Linux Mint 버전 19 Tara를 실행하고 있습니다.

내 배터리 수명은 지금 정말 좋지 않고 이 kworker 스레드에서 내 컴퓨터의 CPU 사용량이 항상 70%이기 때문에 팬이 항상 켜져 있습니다. 이것이 정말로 나를 괴롭히기 시작했습니다. 부팅하자마자 실행했는데 top, 프로그램(터미널 제외)을 열기도 전에 프로세스가 이미 CPU의 70%를 사용하고 있었습니다.

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    5 root      20   0       0      0      0 I  66.1   0.0   1:27.86 kworker/0:0-kac

내가 그것을 실행하면 kworker 스레드가 htop호출되는 것과 .kacpi_notifykacipid

Grub 편집을 시도했지만 acpi=off시스템이 밑줄이 깜박이는 검은색 화면으로 부팅되고 그게 전부입니다. 시작하지 않을 것이다.

커널을 업그레이드하여 이제 5.3.0-51-generic을 실행하고 있습니다. 지금까지 조사한 바에 따르면 BIOS를 업데이트해야 할 수도 있다고 생각하는데, 컴퓨터 제조업체에서는 BIOS 업데이트를 .exe 형식으로만 제공합니다. exe를 다운로드했는데 여기서 어디로 가야할지 모르겠습니다.

누구든지 나를 도와줄 수 있나요?

답변1

다른 사람이 제공한 정보는 본질적으로 정확하지만 해결책은 그렇지 않습니다. 까다로운 부분은 불량 인터럽트를 찾는 것입니다. 이는 사용 중인 하드웨어에 따라 변경되고 펌웨어/BIOS 등을 업데이트할 때도 변경될 수 있습니다. Linux를 실행하고 있다고 가정하면 다음 명령을 실행하여 찾을 수 있습니다.

grep -Ev "^[ ]*0" /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1

위의 코드 조각은 모든 인터럽트를 살펴보고 숫자로 정렬한 다음 가장 높은 개수의 인터럽트를 표시합니다. 내 시스템에서 출력은 다음과 같습니다.

/sys/firmware/acpi/interrupts/gpe69: 7802639     STS enabled      unmasked

명령에 전달된 값을 조정하여 표시되는 인터럽트 수를 늘릴 수 있지만 head관련된 CPU 사용량을 고려하면 매우 드문 경우를 제외하고는 거의 항상 (정렬 후) 첫 번째 줄이 됩니다. 문제의 인터럽트를 식별했다고 가정하면 다음과 같이 비활성화할 수 있습니다.

echo disable > /sys/firmware/acpi/interrupts/gpe69

이 프로세스를 자동화하려면 다음을 포함하는 스크립트를 생성하면 됩니다.

echo disable > $(grep -Ev '^[ ]*0'  /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1 | awk -F: '{print $1}')

위 버전에서는 루트로 실행해야 합니다. 이를 방지하려면 다음을 사용할 수 있습니다.

sudo sh -c "echo disable > $(grep -Ev '^[ ]*0'  /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1 | awk -F: '{print $1}')"

가장 높은 값의 인터럽트가 비활성화된 경우 오류 메시지가 표시됩니다. 위의 코드 조각을 여러 번 실행하면 이런 일이 발생할 수 있습니다. 이런 일이 발생하면 다음과 같은 오류가 표시됩니다.

sh: line 1: echo: write error: Invalid argument

grep비활성화된 인터럽트를 필터링하도록 표현식을 조정하는 것은 쉽습니다 . 이렇게 하지 마십시오. 이렇게 하면 위 명령을 실행하면 일부 중요한 기능이 비활성화될 수 있습니다.

마지막으로, 인터럽트를 비활성화하기 전에 이것이 문제인지 확인하는 것이 현명할 수 있습니다. 아래 패드 중 하나를 사용하여 문제를 식별할 수 있습니다. 매초마다 카운터 값을 인쇄합니다. 이것이 문제라면 값이 빠르게 상승하는 것을 볼 수 있습니다.

while true ; do grep -Ev '^[ ]*0' /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1 ; sleep 1 ; done

내 시스템에서는 다음과 같습니다.

/sys/firmware/acpi/interrupts/gpe69: 7921836     STS enabled      unmasked
/sys/firmware/acpi/interrupts/gpe69: 7925137     STS enabled      unmasked
/sys/firmware/acpi/interrupts/gpe69: 7928459  EN STS enabled      unmasked
/sys/firmware/acpi/interrupts/gpe69: 7931766     STS enabled      unmasked
/sys/firmware/acpi/interrupts/gpe69: 7935122     STS enabled      unmasked

답변2

나는 또한 이 문제를 연구해 왔습니다. BIOS 설정 변경과 다양한 조정을 시도했습니다. 드디어 이 링크를 찾았습니다(https://forum.manjaro.org/t/kworker-kacpid-cpu-100/131532) 그리고 한동안 효과가 있었습니다. Ubuntu, Mint, Win10을 계속 오가다보니 문제가 발생하면 모든 OS로 전환/부팅해도 일관성이 유지됩니다. Ubuntu 20에 위의 수정 사항을 적용한 후에는 부팅한 모든 OS에서 사라졌습니다.

오늘 민트 19.3으로 부팅하니 또 문제가 발생했습니다. 문제는 ACPI 영역의 인터럽트 처리에서 발생하므로 문제를 "재설정"하기 위해 ACPI 이벤트를 어떻게 트리거할 수 있습니까? 나는 컴퓨터를 "일시 중지" 모드로 전환하고 완료될 때까지 기다린 다음 마우스/키보드를 클릭하여 절전 모드를 해제하여 ACPI 처리가 수정되거나 다시 초기화되는지 확인하기로 결정했습니다. 빙고! 깨어나면 CPU 사용량은 즉시 5% 미만 범위로 다시 떨어집니다.

이것은 단지 Linux 문제가 아니라 Windoz로 부팅할 때도 발생합니다. 이것도 제조사만의 문제는 아닌 것 같습니다. 이는 아마도 기본적인 PC 아키텍처/설계 문제일 것입니다. ACPI 초기화 루틴으로 인해 CPU 스파이크가 발생하는 것으로 의심됩니다. ACPI 인터럽트를 처리하기 위해 ISR을 설정하는 데 타이밍 문제가 있을 수 있으므로 인터럽트가 발생하면 INT가 처리되지 않거나 재설정되지 않아 INT가 계속 발생하게 됩니다. 이 정보가 개발자에게 문제를 해결하기 위한 새로운 아이디어를 제공할 수 있기를 바랍니다.

항상 작동한다고 말할 만큼 오랫동안 테스트하지는 않았지만 시도해 볼 가치가 있습니다.

안부 인사, 짐 C

내 설정: HP Z220, i5-3470, 16G DDR3, nVidia Quadro K1200. Adata 960G SSD + WD 160G ATA HD, USB 포트에 연결된 APC UPS, nVidia Quadro K-1200, IBM Model M 키보드(1989) 및 PS/2 입력의 HP 광 마우스. 최고는 아니고 게임용도 아니지만 오래되고 신뢰할 수 있는 제품입니다. ;-)

답변3

소음을 일으키는 인터럽트를 빠르게 찾으려면 다음을 수행하십시오.

awk '$4=="unmasked"&&$1>1000{print FILENAME,$0}' /sys/firmware/acpi/interrupts/*

출력은 다음과 같습니다.

/sys/firmware/acpi/interrupts/gpe0F 616214841     STS enabled      unmasked  
/sys/firmware/acpi/interrupts/gpe2C 616214418     STS enabled      unmasked  
/sys/firmware/acpi/interrupts/gpe39 616179116     STS enabled      unmasked

더 나은 수정을 위해 일부 CPU를 회수할 수 있도록 신속하게 차단하려면 다음을 수행하세요.

for F in $(awk '$4=="unmasked"&&$1>1000{print FILENAME}' /sys/firmware/acpi/interrupts/*)
do sudo tee $F <<<mask; done

에야디야! 부하 평균이 급락하는 것을 보세요! 이제 실제 문제로 넘어갑니다. 첫 번째이자 가장 쉬운 방법은 배포판에서 제공하는 마이크로코드가 설치되어 있는지 확인하는 것입니다. 예를 들어, Arch에서는 프로세서에 따라 intel-ucode 또는 amd-ucode 패키지일 수 있습니다. Ubuntu/Debian 패키지 이름은 intel-microcode 및 amd64-microcode입니다. CentOS/RHEL 시리즈를 사용하는 경우 microcode_ctl 및 linux-firmware를 찾으세요. 어떤 프로세서 브랜드를 보유하고 있는지 모르는 경우 grep vendor_id /proc/cpuinfo알아보세요. 배포판에 특정 지침이 있는 경우마이크로코드 로드, 이것도 꼭 따라주세요. 올바른 마이크로코드가 로드되지 않으면 올바르게 처리되지 않는 잡음이 많은 ACPI 인터럽트가 여러 개 발생할 수 있습니다. 부트로더 구성 변경 사항을 적용하려면 재부팅하세요.

여전히 한두 개의 인터럽트가 발생하고 카운터가 계속 올라가는 경우 지원되지 않거나 결함이 있는 하드웨어가 있을 수 있습니다. 사용하고 있는 특이한 하드웨어에 맞는 드라이버를 찾으십시오. 마스킹시작에이러한 하드웨어 문제가 해결될 때까지는 이것이 최선의 선택일 수 있습니다.

답변4

Jim에게 감사합니다. 제 경우에는 이 오류와 해결 방법을 알게 되어 반갑습니다.

root@HP-6300:/# echo "disable" > /sys/firmware/acpi/interrupts/gpe08

오래되었지만 안정적인 HP i5의 또 다른 주력 제품입니다. Firefox를 단계적으로 중단했습니다..!

관련 정보