1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
<h1>cputemp2maxfreq</h1>
<p>
This daemon sets the cpufreq scaling_max_freq setting and scales it down when
the CPU reaches a given temperature.
</p>
<h2>Why this program?</h2>
<p>
I recently bought a new mainboard, an <a href="https://www.asrock.com/mb/Intel/J5040-ITX/">Asrock J5040-ITX</a>.
This board has a passively cooled CPU which means heat can build up when you
give it a GPU or CPU intensive task. It will happily heat itself up to over
95°C, and since i'm a Gentoo user, that happens quite a lot :-). I thought
it's wasn't a good idea to leave it running for hours at 95°C. One
solution could be to add a small fan, but I hate fans and that's why i got a
fanless mainboard in the first place. The other solution is to reduce CPU heat
generation when the temperature is too high, and the best way to do that is to
reduce it's frequency as can be done with cpufreq within linux.<br>
When I discovered there is no program to do that i deciced to write it myself.
</p>
<h2>What does this program do?</h2>
<p>
It's basic function is simple: It reads the CPU's temperature sensor and if
the temperature is above a certain threshold it will lower scaling_max_freq to
lower the CPU speed and allow it to cool down. When the temperature drops
below the threshold it will increase scaling_max_freq again to allow it to
reach it's full speed.
</p>
<p>
There is a lot you can tune and do with this basic function, these are the
options you can pass to cputemp2maxfreq:
</p>
<p><strong>Scaling options:</strong></p>
<ul>
<li><strong>-d</strong> sets the transition latency (the time it takes the
CPU to apply a new frequency). This is a value in microseconds or the
keyword "auto" for autodetection.</li>
<li><strong>-f</strong> sets the fallback frequency. In case something goes
wrong the program sets the CPU frequency to it's minimum. In case that
fails too it will try the fallback frequency</li>
<li><strong>-g</strong> the cpufreq governor to use. Conservative seems to work
nicely with this daemon's concept. Use the special keyword
"keep" to prevent this daemon from changing the governor</li>
<li><strong>-i</strong> set the input for CPU temperature. This can be set in several ways:
<ul>
<li>An absolute path (usually somewhere in /sys), this should start with a /
</li>
<li>The name of a sensor (for example "Package id 0" from coretemp)
don't forget to quote when the name contains spaces</li>
<li>The word "auto" triggers autodetection</li>
</ul>
</li>
<li><strong>-k</strong> keep the last state instead of setting minimum speedi
on exit</li>
<li><strong>-p</strong> set poll interval</li>
<li><strong>-P</strong> set the Physical CPU numer (socket numer) for multi
CPU systems. Note that this is only needed for systems with more than one
physical CPU's, it's not needed for multi Core CPU's.</li>
<li><strong>-s</strong> set the step size to increase/decrease CPU speed.
Note that this value will be multiplied by the difference between the CPU
temperature and the set temperature to calculate the actual change.</li>
<li><strong>-t</strong> set the temperature limit</li>
</ul>
<p><strong>Logging options:</strong></p>
<ul>
<li><strong>-c or -C</strong> will log data to a CSV file which can be used
for analysis later. See the paragraph below on how to use it with
LibreOffice. -c will append data, -C will overwrite an existing file</li>
<li><strong>-l</strong> set the logging mechanism to use. Possible values:
<ul>
<li><strong>none</strong>: No logging at all</li>
<li><strong>kmsg</strong>: Log to the kernel log so you can see it with dmesg</li>
<li><strong>stdout</strong>: Log to stdout, especially useful when testing/tuning</li>
<li><strong>syslog</strong>: Log to syslog, it will use facility Daemon and level Critical</li>
</ul></li>
<li><strong>-m</strong> log measurements (CPU temperature and frequency) via logger</li>
<li><strong>-u</strong> use unix timestamps in log and CSV outputs instead of YYYY-MM-DD
HH:MM:SS</li>
</ul>
<p><strong>Other options</strong></p>
<ul>
<li><strong>-h</strong> displays a help text listing all the options</li>
<li><strong>-v</strong> displays version and license information.</li>
</ul>
<p>
To use the CSV file with libreOffice first stop the daemon to make sure all
data has been written. Then use LibreOffice Calc to open the CSV file. In the
text import dialog use the following options:
</p>
<ul>
<li>Separated by Comma</li>
<li>String delimited: "</li>
<li>Other options: Only set Detect special numbers, other options should be disabled</li>
</ul>
<p>
The preview should already show a nicely formed table, so click Ok.
</p>
<p>
If the document is opened read-only, click the Edit Document button. Select
the whole sheet, open the Insert menu and choose Chart...
</p>
<p>
Now select Chart Type XY (Scatter) and subtype Lines Only and click Finish.
</p>
<p>
You should now have a graph and depending on the number of data points it
might beusefull to make it wider to give the graph some more space. Becaue
the CPU temperatures are much lower numbers than the frequencies it's useful
to add a second Y axis, to do so click on the background and choose
Insert/Delete axes and enable the secondary Y axis. Now click the first
temperature line (usually at the bottom of the chart) and choose Format Data
Series, and set Allign Data Series to Secondary Y axis. Do the same for the
second temperature line.
</p>
<p>The resulting graph should look like this:</p>
<img src="../plain/lo_graph_example.png">
<p>
At the start of the graph the CPU Temperature (green line) was low enough to
allow the Scaling Maximum Frequency (light blue line) to go up to the CPU's
Maximum Frequency (red line). Then it got a heavy task to do, the CPU's
Current Frequency (yellow line) was scaled up to almost maximum and that
heated up the CPU. At around 12:37:26 the CPU Temperature has risen above the
Target Temperature (black line) and the Scaling Maximum Frequency was
lowered and the CPU Current Frequency followed. At around 12:40:19 the job was
finished and the CPU Frequency was scaled down for lower power consumtion,
it cooled down and that allowed the Scaling Maximum Frequency to be increased
the CPU's Maximum Frequency again. The scaling between 12:37:26 and 12:40:19
was done by this daemon.
</p>
<p>
Also note that the temperature given to this program is not a <i>maximum</i>
temperature but a target. As can be seen in the graph above the temperature
will rise above this temperature before action is taken. Depending on the CPU
load and poll interval this could be a significant difference, so keep the
target temperature well below your CPU's maximum temperature.
</p>
<h3>Hardware requirements</h3>
<p>
In order to be able to use this program there are some hardware requirements:
</p>
<ul>
<li>Your CPU should have a temperature sensor that is available in sysfs (most CPU's
have this)</li>
<li>Your CPU should be able to be set to any frequency in a range. Especially some older
CPU's could only use a limited set of fixed frequencies, this is unusable.</li>
</ul>
<h2>How to install this program</h2>
<p>
Since i'm a Gentoo user i made an ebuild provided in the gentoo directory of
the source code. Place it in your own overlay to use it, the suggested
category is sys-power. The ebuild will install the binary in /usr/sbin and
install an initscript so you can start the daemon on boot.
</p>
<p>
To install from source manually the best way is to <strong>git clone
https://code.pa4wdh.nl.eu.org/tools/cputemp2maxfreq</strong>. Change to the
source directory and type <strong>make</strong> to start the build proces. It
shouldn't take long since this is a very small program. The result should
be an executable called cputemp2maxfreq.
</p>
<h2>What can i do with this program?</h2>
<p>
The daemon has two uses: Get the maximum performance from your CPU when the
temperature allows it, and protect the hardware from overheating.
</p>
<p>
This program is distributed as Free Software under the GPL version 3, see the
<a href="../tree/COPYING">COPYING file</a> for details.
</p>
<p>
Since i'm a Gentoo user there is a topic about this program on the
<a href="https://forums.gentoo.org/viewtopic-t-1163405.html">Gentoo forums</a>.
</p>
<p>Happy computing!</p>
|