Disassembler

Artificial intelligence is no match for natural stupidity.
14ledna2012

Kworker vytěžující CPU v deb-based systémech


Nedávno dostal můj linuxem nepříliš zatížený kolega za úkol přeinstalovat firemní úložiště kamerových záznamů. Požádal mě o asistenci, a protože bylo potřeba zachovat stávající konfiguraci, použili jsme jeho laptop jako testovací prostředí, abychom viděli, jak se software s upgradem popere a zda je vůbec možné takovou akci provést v ostrém provozu. Jelikož srdcem celého systému bylo Ubuntu 10.10, bylo v rámci zachování co největší kompatibility vhodné instalovat nový systém na něco podobného - tedy Ubuntu Server 11.10. Po instalaci čistého OS jsme si však všimli zvláštní věci. Holý systém, na kterém nic neběželo, chvíli po startu začal jen tak ze srandy vytěžovat CPU na 15%.

Už tam budem? Už tam budem?


Po náhledu do topu bylo jako viník označeno jedeno z kworker vláken kernelu. Letmé zagooglení přineslo objev na serverový systém poměrně nečekaný. Problém byl v grafice, respektive v nastavení pollingu kernel mode settings Direct Rendering Inrastructure modulu. Výskyt toho problému je nejčastěji hlášen u starších (tedy pre-Sandy Bridgeových) Intelových integrovaných grafik a jelikož se právě taková v laptopu nacházela, bylo jasno. Obyčejně se polling používá právě proto, aby systém negeneroval příliš velký počet přerušení a nedocházelo ke snížení výkonu, ale v tomto případě bylo třeba udělat věc přesně obrácenou a polling DRM KMS helperu zakázat. To se dá ovšem provést pouze u kernelu verze 2.6.36 a vyšší. 2.6.35 toto nastavení neumožňuje, takže pokud máte stejný problém na starším kernelu, vřele doporučuji aktualizaci (a nejen kvůli tomuto problému). K tomu abyste zjistili, zda zastavení pollingu váš problém vyřeší, použijte one-liner

echo "N" > /sys/module/drm_kms_helper/parameters/poll

Tato úprava vydrží pouze do restartu. Pokud se zadařilo a kworker (případně kslowd) thread CPU nadále nevytěžuje, můžete workaround aplikovat permanentně úpravou konfiguračního souboru modprobe

echo "options drm_kms_helper poll=N" > /etc/modprobe.d/local.conf

Ubuntu 11.10 sedí na trojkovém kernelu a 3.0.0 je pořád více než 2.6.35, takže i zde výše uvedený workaround funguje. Dle informací roztroušených po internetu je prvotním příznakem tohoto problému zpomalený X server, případně zamrzající kurzor myši (což se mi v konzoli ověřovalo blbě) a také se prý tento problém může vzácně objevit i u některých grafik od ATI.