neděle 19. ledna 2014

Monitorování HW senzorů nejen s Conky

Včera se mě kamarád zeptal "jak jsi v conky poznal, ktery sensor je pro ktere CPU?". Šlo o zobrazování teploty jader jeho dvouprocesorového počítadla, k čemuž v conky slouží proměnná hwmon. Zákeřná otázka, vzpoměl jsem si jen na to, že mi to kdysi také nebylo hned jasné, ale to už je přes čtyři roky, co jsem se tím zabýval, od té doby mé conkyrc prostě funguje. Tak jsem pro jistotu nahlédl do dokumentace a uvědomil si, že své CPU sice monitoruju správně, ale že mi v conkyrc hnijí související konstrukce horšího ražení, než drbat se levou rukou v levém podpaží. Přesněji řečeno, parsoval jsem třeba výstup příkazu sensors, abych dostal otáčky větráků. Takže to trochu proberu, třeba to někomu pomůže...


lm-sensors

Nástrojem, který vám zpřístupní výstupy čidel vašeho systému, je lm-sensors s knihovnou libsensors a nástroji sensors-detect a sensors. První nástroj (spuštěný s právy nejvyššího) proleze systém, najde všechny známé čipy a senzory sledující hardware, vypíše všechny moduly jádra, které vám je zpřístupní a nabídne jejich zápis do /etc/modules, aby se zaváděly při startu systému. Po zavedení patřičných modulů do jádra již nic z lm-sensors nepotřebujete k tomu, abyste mohli v Conky výstupy čidel zobrazovat, všechno dodá kernel.

Součástí balíku lm-sensors je i služba (service), ale ve skutečnosti to není žádný démon, který by v systému běžel, její start jen spustí sensors s přepínačem -s, který projde konfigurační soubory /etc/sensors3.conf a /etc/sensors.d/* a zkontroluje syntaxi. Tyto konfigurační soubory jsou důležité především pro majitele senzorů, které "kecají", tedy udávají jiné hodnoty, než jsou reálné, protože je tu můžete pomocí klíčového slova set přepočítat na reálné. Plno těchto ukecaných čipů je podchyceno ve výchozím /etc/sensors3.conf a při spuštění příkazu sensors tak můžete dostat hodnoty patřičně zkorigované. Pokud váš ukecaný senzor korekci nedostal, můžete si přidat vlastní zápisem do souboru v /etc/sensors.d/. Současně máte možnost přepsat i popisky jednotlivých čidel pomocí klíčového slova label a výstup sensors si zpřehlednit.

Pokud si budete doplňovat konfiguraci sensors, bude se vám hodit syrový výstup, který odhalí které systémové soubory obsahují konkrétní hodnoty:

$ sensors -u
coretemp-isa-0000
Adapter: ISA adapter
Core 0:
  temp2_input: 35.000
  temp2_max: 80.000
  temp2_crit: 100.000
  temp2_crit_alarm: 0.000
Core 1:
  temp3_input: 35.000
  temp3_max: 80.000
  temp3_crit: 100.000
  temp3_crit_alarm: 0.000

it8718-isa-0290
Adapter: ISA adapter
in0:
  in0_input: 1.072
  in0_min: 0.000
  in0_max: 4.080
  in0_alarm: 0.000
  in0_beep: 0.000
...

fan1:
  fan1_input: 598.000
  fan1_min: 10.000
  fan1_alarm: 0.000
  fan1_beep: 1.000
...

Srovnejte s:
$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +35.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:       +35.0°C  (high = +80.0°C, crit = +100.0°C)

it8718-isa-0290

Adapter: ISA adapter
in0:          +1.07 V  (min =  +0.00 V, max =  +4.08 V)
...
fan1:         623 RPM  (min =   10 RPM)
...


Jinak doporučuju wiki Archu, tam jsou (nejen) lm-sensors podrobně:
https://wiki.archlinux.org/index.php/lm_sensors


Jak se dostat k původním datům z shellu

Conky i sensors data ze senzorů někde čtou a stejně tak je můžete číst i vy. Kernel to všechno dává k dispozici skrz virtuální souborový systém sysfs, konkrétně v adresáři /sys/devices/, kde má každé zařízení vlastní adresář, ale pro naše účely srozumitelnější strukturu naleznete v /sys/class/hwmon/, s podadresáři ve formátu hwmonX, kde X je pořadové číslo čipu, vracejícího určitou sadu hodnot. V mém systému s C2D na desce Gigabyte jsou k dispozici hwmon0, obsahující data z CPU (coretemp) a hwmon1 s daty ze základní desky (it8718). To pořadí, v jakém příkaz sensors vypisuje čipy, by mělo odpovídat číslování hwmon adresářů v systému. V hwmonX vás pak bude zajímat především adresář device, kde jsou již konkrétní data. Soubory s aktuálními hodnotami mají přívlastek input.

$ ls /sys/class/hwmon/hwmon0/device/
driver    power             temp2_input  temp3_crit_alarm  uevent
hwmon     subsystem         temp2_label  temp3_input
modalias  temp2_crit        temp2_max    temp3_label
name      temp2_crit_alarm  temp3_crit   temp3_max

Najdete zde také jméno modulu (name), které se objevuje i ve výpisu sensors. Nejjednodušším způsobem, jak si ujasnit, které adresáře patří kterému modulu, je vypsat si je i s jejich jménem:

$ grep -H "" /sys/class/hwmon/hwmon*/device/name
/sys/class/hwmon/hwmon0/device/name:coretemp
/sys/class/hwmon/hwmon1/device/name:it8718

Teplotu prvního jádra CPU si tedy přečtu takto:
$ cat /sys/class/hwmon/hwmon0/device/temp2_input
35000

Některé senzory mají i popisky, takže si můžete zkontrolovat, co to opravdu je:
$ cat /sys/class/hwmon/hwmon0/device/temp2_label
Core 0

Druhé jádro mám v temp3. Každopádně jste si jistě všimli, že výstup je v tisícinách °C, takže bude třeba výstup trochu upravit. Rozlišení je stejně jen 1°C, takže to stačí oříznout:

$ cat /sys/class/hwmon/hwmon0/device/temp2_input | sed 's/000$//'
35

Když potřebuju zjistit pouze otáčky ventilátoru na CPU, což je fan1 na mé desce, nebudu zbytečně parsovat výstup sensors, jak jsem to dělal do včerejška, ale sáhnu si pro konkrétní hodnotu přímo:

$ cat /sys/class/hwmon/hwmon1/device/fan1_input
625

Senzory napětí (obecně značené jako in) zase dávají výstup v milivoltech a pokud to chci ve voltech na dvě desetinná místa, jako to zobrazuje sensors, musím přidat trochu počítání, když to chci zaokrouhlit. Tak pro zajímavost:

#!/bin/bash
p=2             # požadovaný počet desetinných míst
v=$(echo $(cat /sys/class/hwmon/hwmon1/device/in1_input)/1000 | bc -l)
echo "scale=$p;(((10^$p)*($v))+0.5)/(10^$p)" | bc -l


Conky

Výše popsané vám pomůže pochopit, co napsat do proměnné hwmon v conkyrc. Například chci-li zobrazit teplotu prvního jádra CPU, zapíšu to v conkyrc takto (schválně dám hned pod to cestu v sysfs, na které ta hodnota je):

${hwmon 0 temp 2}
 /sys/class/hwmon/hwmon0/device/temp2_input

Pro otáčky ventilátoru 1, v mém případě na CPU:

${hwmon 1 fan 1}
/sys/class/hwmon/hwmon1/device/fan1_input

A tak dále. Protože Conky čte hodnoty přímo ze systému, nepoužívá sensors, které mají v konfiguraci plno anomálií podchyceno, musíte si do příkazu zapsat i případné korekce, pokud vám čidlo šmajdá. Vypadá to zhruba takto:

${hwmon 0 temp 2 1.6 10.0}

Pak Conky výstup ze senzoru vynásobí 1.6 a připočte 10. Čísla musí být desetinná, proto 10.0 a ne jen 10.

Závěr

Pokaždé když se podívám do svého conkyrc (nedělám to zas tak často), najdu tam něco, co se dá zjednodušit, vyhodit, nahradit, zrychlit. Takže Logoutovi díky za dotaz, zase jsem si to malinko doladil.

5 komentářů:

  1. Pěkný povídání! Zrovna jsem se chtěl do monitorování pustit, jen jsem byl zatraceně shnilej to zprovoznit, ale tohle je návod naservírovanej na stříbrným podnose. Ještě by mě zajímalo, jak zjišťuješ počet updatů systému a ke štěstí mi už nic nechybí ;)

    OdpovědětVymazat
    Odpovědi
    1. Pro ty aktualizace zatím takto:
      aptitude search ~U | wc -l
      apt je na prd v tomto směru

      Vymazat
  2. S conky jsem začal před týdnem používám tvoje .conkyrc , která upravuji
    Teploty jsem včera řešil takto ${exec sensors | grep 'Core 1' | awk '{print $3}'}
    Pěkný článek - večer vyzkouším. Děkuji - Mirek13 -Xubuntu 13.10.

    OdpovědětVymazat
    Odpovědi
    1. Vyzkoušej. A když budeš příště dolovat a hodí se awk, tak se můžeš jedné roury se subshellem zbavit:
      sensors | awk '/Core 1/{print $3}'

      Vymazat
    2. I když ještě musím dodat, že při prohledávání velkého množství textu je grep rychlejší, takže pak může být výhodnější to, cos použil :)

      Vymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.