Датчик температуры процессора

Morisson
Чего у виндов-то все работает и получается.. Пусть и с грязными хаками.. Это печально..
у разрабов платного ПО под винду есть материальные ресурсы на приобретение кучи разных железок.
в лине принцип другой, сделай себе и поделись с другими...

Vadim
В остальном виндовс кривая,глючная,дырявая хрень.
+100500
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Привожу просто для информации, делать было нечего, пить надоело (но в связи с большим праздником, разумеется 100г принял) и решил немного поупражняться.
В принципе эту физическую температуру cpu можно расчитать и самому - сейчас набросал небольшой скриптик, считал показания (относящиеся к температуре) из регистров msr, выполнил определенные вычисления, чтобы привести их в человеческую форму.
Привожу вывод значений температуры cpu с периодичностью в 2секунды (где значения sys - считаны из файла sys/class/thermal/thermal_zone6/temp, значения reg - считаны и обработаны из регистров , для нагрузки cpu использовал утилиту stress –cpu 2 –io 4 –vm 2 –vm-bytes 128M –timeout 10s)
~/cpu_t.sh
sys - 53 ... reg - 52
sys - 54 ... reg - 54
sys - 54 ... reg - 52
sys - 54 ... reg - 51
sys - 66 ... reg - 62
sys - 66 ... reg - 63
sys - 68 ... reg - 64
sys - 70 ... reg - 65
sys - 70 ... reg - 66
sys - 58 ... reg - 56
sys - 58 ... reg - 54
sys - 57 ... reg - 54
sys - 55 ... reg - 54
sys - 56 ... reg - 54
sys - 56 ... reg - 57
sys - 55 ... reg - 55
sys - 54 ... reg - 54
В спокойном режиме значения совпадают довольно хорошо, а вот при нагрузке видим несовпадение, причем чем выше температура, тем больше не совпадение (хотя разница не такая и большая). И не понятно кому верить - значениям системе или обработанным значениям снятых непосредственно с регистров.
Думаю расчет напрямую более верен, а вот как идет расчет в системе, не знаю. Возможно это связано с инерционностью.

UPD - хотя помнится (как то попал на глаза один толмут), что погрешность (точнее, отклонение от истинной температуры) тем больше, чем выше измеряемая температура.

EDIT 1 - все несуразные показания температуры обусловлены в основном тем, что вместо соответствующего модуля (используемого для обработки значений температуры) для данного железа используется другой модуль, в котором не правильно идет расчет истинной температуры.
Вот чем и хорош Linux, что при желании можно самому сделать очень многое. Хотя это возможно и в Windows, но уже намного сложнее.
Ошибки не исчезают с опытом - они просто умнеют
vasek, а если так?
ls /sys/class/thermal/*/
/sys/class/thermal/cooling_device0/:
cur_state  device  max_state  power  subsystem  type  uevent

/sys/class/thermal/cooling_device1/:
cur_state  device  max_state  power  subsystem  type  uevent

/sys/class/thermal/cooling_device2/:
cur_state  device  max_state  power  subsystem  type  uevent

/sys/class/thermal/cooling_device3/:
cur_state  device  max_state  power  subsystem  type  uevent

cat /sys/class/thermal/*/*
0
cat: /sys/class/thermal/cooling_device0/device: Это каталог
10
cat: /sys/class/thermal/cooling_device0/power: Это каталог
cat: /sys/class/thermal/cooling_device0/subsystem: Это каталог
Processor
0
cat: /sys/class/thermal/cooling_device1/device: Это каталог
10
cat: /sys/class/thermal/cooling_device1/power: Это каталог
cat: /sys/class/thermal/cooling_device1/subsystem: Это каталог
Processor
0
cat: /sys/class/thermal/cooling_device2/device: Это каталог
10
cat: /sys/class/thermal/cooling_device2/power: Это каталог
cat: /sys/class/thermal/cooling_device2/subsystem: Это каталог
Processor
0
cat: /sys/class/thermal/cooling_device3/device: Это каталог
10
cat: /sys/class/thermal/cooling_device3/power: Это каталог
cat: /sys/class/thermal/cooling_device3/subsystem: Это каталог
Processor
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
а если так?
ls /sys/class/thermal/*/
Слишком много
ls /sys/class/thermal/*/ | wc -l
216
Не понял, к чему это?
Как уже писал, это создается с помощью соответствующего модуля ядра и это все относится к ACPI thermal (выпуск старый, но в новом doc тоже самое) .
У Vadim, насколько я понял, всех этих файлов нет, хотя странно - у тебя то же AMD и эта структура файлов имеется, а у него нет. Или я чего то неправильно понял?

В Intel расчет температуры можно понять из описания datesheet, причем этот способ практически универсален в Intel. Есть регистр из которого считывается максимальная температура, которая согласно спецификации (привожу свои данные) равна - Tjunction = 85C (PGA); 100C (BGA)
у меня PGA, а значит будет 85С
Смотрим что показывает регистр (обозначение регистра узнаем в datesheet)
rdmsr 0x1A2 -f 23:16
55
Это в 16-ричной системе, переведем в 10-ную
echo $((0x55))
85
то есть все правильно
Далее согласно того же datesheet, в регистре MSR 19C находится мгновенная температура данного ядра, но ЭТО не абсолютная температура, а относительная, относительно Tjmax, которая равна, как было показано выше 85. То есть истинная температура будет равна
Tjmax - Treg, точнее 85 - Treg
Проверяем,
rdmsr 0x19C -f 23:16
24
echo $((0x24))
36
И получаем окончательно, 85 - 36 = 49
UPD 1 - как уже писал, согласно doc в регистре мгновенная температура ядра, но там же рекомендуют использовать усредненную (не помню точно как определяется), но вот у меня сложилось мнение, что система ACPI и использует эту усредненную температуру.
UPD 2 - таким же макаром можно расчитать и у AMD, но я с ним никогда не разбирался, но придется глубоко залазить.

EDIT 1 - этот расчет я использую на основе описания документации, т.е. выполнил на основе doc, а вот как идет расчет в модулях, я не знаю, но уже писал, что похоже там используют усреднение. Но, в принципе, такая точность и не нужна ... да и считать так не нужно, если все работает нормально, если что просто для проверки
Ошибки не исчезают с опытом - они просто умнеют
vasek
Не понял, к чему это?
да я это к тому что не все так просто. ты выше писал делая упор на только на процессор. но нужно еще и на мать обращать внимание, да и у процессоров одного производителя может все отличаться...
и еще если взять ту же виндячью аиду64, и даже если учесть что она платная, то все равно она ерунду показывает (по крайней мере с моими железками)... даже они с их ресурсами не смогли сделать так, что бы все показывалось правильно...
так что повторюсь, не все так просто в зоопарке железок...
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
vasek
У Vadim, насколько я понял, всех этих файлов нет, хотя странно - у тебя то же AMD и эта структура файлов имеется, а у него нет. Или я чего то неправильно понял?
Vadim
$ cat /sys/class/thermal/thermal_zone*/{type,temp}
cat: '/sys/class/thermal/thermal_zone*/type': Нет такого файла или каталога
cat: '/sys/class/thermal/thermal_zone*/temp': Нет такого файла или каталога
заметь thermal_zone и у меня тоже нет, а вместо него cooling_device.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
тоже амд, тоже нету thermal_zone, но есть cooling_device
nafanja
не все так просто в зоопарке железок…
Это точно. Даже если считать самому, есть несколько нюансов, которые я упустил. Например, нужно считывать значения еще в двух регистрах (в принципе регистр один, но разные биты) и эти значения нужно вычитать как из считанного Tjmax, так и из считанного относительного Treg - в datesheet написано, что по дефолту эти значения равны 0, но я сталкивался с cpu одного типа, но вот эти значения были не равны 0. Так, например, у меня сейчас в одном из регистров стоит 1, которую нужно вычитать из 85 .... и выходит, что мне нужно оперировать не с значением 85, а 84. У кого то эти значения будут и по более, а прога то это, наверное, не учитывает и считает для всех одинаково.
Возможно я и не прав.
Ошибки не исчезают с опытом - они просто умнеют
nafanja
redix, у всех разное железо, кому то повезло и все работает как задумано…
Имхо дело не в этом, ТС вызывает температуру обращением к sensors, и это теперь не работает. Свои коньки я писал под Центосью, там как раз так и было сделано и это работало, но там ядро 3.10, а когда я этот конфиг подцепил к Арчу, температура тоже показывала неправильно, проблему решило обращение к hwmon, я уже не помню где нашел, но это работает. К слову сказать этот самый hwmon связан с lm_sensors, а его разработкой занимается Торвальдс: https://github.com/torvalds/linux/blob/master/include/linux/hwmon.h

Изменено начиная с ядра 4.19.
In Tux We Trust
redix
проблему решило обращение к hwmon, я уже не помню где нашел, но это работает.
Кстати, в ссылке, что давал выше, про hwmon расписано, правда подробно не читал.
Ошибки не исчезают с опытом - они просто умнеют
 
Зарегистрироваться или войдите чтобы оставить сообщение.