Измерение температуры при тестировании в Linux - PullRequest
0 голосов
/ 01 июня 2019

Я хочу измерить температуру и частоту машины с двумя гнездами во время выполнения теста High-Performance Linpack.

Я написал сценарий оболочки sensor.sh, который я запускаю в фоновом режиме с sh sensors.sh &, а затем перехожу к тесту.

for ((;;))
do
awk 'BEGIN{ORS=" ";} $2=="MHz" {print $4} END {print "\n"}' /proc/cpuinfo >> cpuf.dat

awk 'BEGIN{ORS=" ";} {print $1} END {print "\n"}' /sys/devices/platform/coretemp.?/hwmon/hwmon?/temp*_input >> cput.dat
 sleep .1
done

Я получаю свои выходные файлы, однако метки времени не находятся на расстоянии 0,1 с друг от друга.Я предполагаю, что система занята, и процесс сценария оболочки не выполняется так часто.HPL сообщает, что время его работы составляет ~ 1100 с, в этот раз мой файл Temperature.dat сгенерировал ~ 4600 записей.

Есть ли другой способ измерения температуры и частоты при выполнении моей программы тестирования производительности и сохранения результатов в.dat файл?

Ответы [ 2 ]

2 голосов
/ 02 июня 2019

Ваш сценарий очень неэффективен, требуя от множества отдельных процессов, чтобы каждый получил некоторое время ЦП, прежде чем он сможет запустить следующую sleep .1, так что да, загрузка системы заставит его запускаться реже.

Кроме того, sensors является относительно дорогим;возможно используйте параметры командной строки, чтобы он проверял только температуру процессора.Или я думаю, что температура процессора доступна из файлов в /proc или /sys напрямую.


xargs без аргументов по умолчанию echo, так что это просто неэффективный способ свернуть пробельные символы(включая перевод строки) на пробелы.(Если вы используете printf '%s\n' foo bar | strace -f xargs, вы можете увидеть, что он на самом деле выполняет fork + execve /bin/echo вместо простой печати самого вывода, как вы могли бы сделать с sed или tr.)

, вы можете использовать большеэффективные команды для обработки текста, которые требуют меньше процессорного времени и меньше переключений контекста, пропуская меньше отдельных процессов.Например, sensors передается в одну команду awk, которая выполняет всю обработку текста.И sed -n 's/cpu MHz : //p' /proc/cpuinfo >> frequency.dat, чтобы избежать бесполезного использования cat (и xargs).

Но это все еще будет иметь некоторые накладные расходы.


Вы могли бы написать один perlскрипт, который передает с sensors и закрывает / открывает /proc/cpuinfo. . Это позволит избежать всех системных вызовов, которые выполняет запуск процесса.

Вместо того, чтобы спать в течение фиксированного времени, вы можетепусть он проверяет текущее время и спит до следующего кратного 0.1 секунд. Вы можете сделать это и с помощью bash, но для этого потребуется выполнить еще больше команд, и вы захотите вызвать как можно меньше переключений контекста дляВаш эталонный тест.


Вы также можете или вместо этого пометить каждую строку текущим временем, чтобы вы знали, когда пришел каждый образец.Чтобы сделать это без необходимости запуска другого внешнего процесса, используйте команду bash $EPOCHREALTIME.Например, { echo -n "$EPOCHREALTIME "; awk ...; } >> cpuf.dat, если вы все еще используете bash вместо Perl.

2 голосов
/ 01 июня 2019

Вы можете попробовать запустить свой код с высоким приоритетом, чтобы он не оказывал влияния на загрузку теста. Но вам нужно запускать с правами root, чтобы иметь возможность использовать отрицательную милость.

nice -n -10 bash
for ((;;))
do
 sensors | grep Core | awk '{print $3}' | tr '+' ' '  | tr '°C' ' ' | xargs >> temperature.dat
 cat /proc/cpuinfo | grep "cpu MHz" | tr "cpu MHz : " " " | xargs >> frequency.dat
 sleep .1
done
exit
...