평소 부하가 적은 대시보드로 사용 중인 장비인데 부하가 점점 증가해서 전체적으로 성능이 저하되는 문제가 반복되었습니다. CPU 부하를 보니 kidle_inject 라는 프로세스가 CPU 부하를 발생하고 있었습니다. 참로고, Ubuntu 16.x, 18.x 모두에서 발생하는 문제라고 합니다.
kidle_inject 로 인한 CPU 부하 증가
kidle_inject 는 CPU 온도가 일정 기준 이상으로 올라가면 CPU 를 과열로 부터 보호하기 위해 동작하는 CPU 보호 프로세스임을 확인 할 수 있었습니다. 그런데, 역설적으로 이 프로세스가 실행이 되면 CPU 부하가 상승하게 되고, CPU 부하 상승은 CPU 온도를 상승 시키고 다시 kidle_inject 프로세스가 CPU 부하를 더욱 발생시키는 악순환이 발생한다는 것입니다. 결과적으로 해당 장비의 전체적인 성능 저하를 발생시킵니다. (그림 1 참고)
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)