평소 부하가 적은 대시보드로 사용 중인 장비인데 부하가 점점 증가해서 전체적으로 성능이 저하되는 문제가 반복되었습니다. CPU 부하를 보니 kidle_inject 라는 프로세스가 CPU 부하를 발생하고 있었습니다. 참로고, Ubuntu 16.x, 18.x 모두에서 발생하는 문제라고 합니다.

kidle_inject 로 인한 CPU 부하 증가

kidle_inject 는 CPU 온도가 일정 기준 이상으로 올라가면 CPU 를 과열로 부터 보호하기 위해 동작하는 CPU 보호 프로세스임을 확인 할 수 있었습니다. 그런데, 역설적으로 이 프로세스가 실행이 되면 CPU 부하가 상승하게 되고, CPU 부하 상승은 CPU 온도를 상승 시키고 다시 kidle_inject 프로세스가 CPU 부하를 더욱 발생시키는 악순환이 발생한다는 것입니다. 결과적으로 해당 장비의 전체적인 성능 저하를 발생시킵니다. (그림 1 참고)

그림 1. CPU 부하 변동 그래프. 붉은 화살표 기준, 왼쪽이 비정상적으로 높은 상태이고, 오른쪽이 정상 상태의 부하 상태임.

CPU 온도의 확인

현재 동작 중인 장비의 CPU 온도를 확인해 보아야 했습니다. “Zabbix 이용 CPU/Hard 온도 모니터링“에서 언급했던 lm_sensors 유틸을 이용하여 온도를 확인 할 수 있었습니다. 결과를 보면, Core 0 의 온도가 crit 기준치와 같습니다. 이 경우, kidle_inject 프로세스가 동작하는 조건이 됩니다.

$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +90.0°C  (high = +72.0°C, crit = +90.0°C)
Core 0:         +90.0°C  (high = +72.0°C, crit = +90.0°C)
Core 1:         +89.0°C  (high = +72.0°C, crit = +90.0°C)

kidle_inject 의 제거

kidle_inject 프로세스는 필요한 것일까요? 결론부터 말하자면 꼭 필요하지는 않습니다. 단지, 프로세스를 종료하는 작업 전/후 모니터링에서 실제로 성능에 영향이 없는지를 확인을 해야 합니다. kidle_inject 가 실행되었을 때, 바로 프로세스를 찾아서 종료하는 것은 너무나 쉬운 문제이지만 아주 실행이 되지 않도록 할 수 있습니다. 바로 해당 기능 모듈을 Kernel 로 부터 빼 버리는 겁니다.

$ sudo rmmod intel_powerclamp

현재 동작 중인 장비에서 모듈을 빼 버린다고 해도 장비를 재부팅하면 다시 동작하게 됩니다. 이를 방지 하기 위해서는 다음과 같이 해당 모듈을 blacklist 모듈에 추가해서 재부팅 할 때에도 해당 모듈을 kernel 에서 불러 들이지 못하도록 하면 됩니다.

$ sudo su -
root:~# echo "blacklist intel_powerclamp" > /etc/modprobe.d/disable-powerclamp.conf

결론

위와 같이 조치하고 하루가 경과했을 때의 CPU 온도를 다시 측정해 보았습니다. CPU 온도가 90°C 에서 77°C 로 13°C 나 떨어졌습니다. 전체적인 CPU 부하도 [그림 1] 의 우측과 같이 0.5 이하를 유지하고 있는 것을 확인 할 수 있습니다.

$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +77.0°C  (high = +72.0°C, crit = +90.0°C)
Core 0:         +77.0°C  (high = +72.0°C, crit = +90.0°C)
Core 1:         +74.0°C  (high = +72.0°C, crit = +90.0°C)