Hardware Temperature Monitoring

FreeBSD, and thus pfSense® software, supports monitoring hardware temperature on some chipsets. Unfortunately, support for this is limited but growing as hardware is replaced by newer Intel and AMD CPUs that include better monitoring. Where supported, it can be useful.

Widgets and Graphs

The System Information dashboard widget contains a single Temperature entry on systems with one or more available temperature sensors.

The Thermal Sensors widget displays the temperature from every available thermal sensor on the firewall. It also has configurable behavior for warning thresholds and output contents.

When the firewall detects that support for temperature monitoring is available, it also graphs the temperatures over time. See Monitoring Graphs for details.

Intel and AMD Temperature Monitoring

There is an option to select either an Intel or AMD temperature monitor module under System > Advanced on the Miscellaneous tab. These modules work with Intel Core series and later Intel chips, and similarly recent AMD chips, respectively. Support is not universal, but it is common, especially on Intel chips, even Atom-based chips. The temperature can be observed using the Thermal Sensors dashboard widget or by sysctl:

# sysctl -a | grep "dev.cpu.*.temperature"
dev.cpu.0.temperature: 46.0C
dev.cpu.1.temperature: 47.0C
dev.cpu.2.temperature: 47.0C
dev.cpu.3.temperature: 47.0C

These are typically on-die sensors so they only represent the CPU core temperatures, not other zones in the system.

ACPI Thermal Monitoring

FreeBSD also handles some settings through ACPI. To see if the hardware supports temperature monitoring, try the following command from a shell prompt or Diagnostics > Command:

sysctl hw.acpi.thermal

If the hardware is supported, output similar to the following will be shown:

hw.acpi.thermal.min_runtime: 0
hw.acpi.thermal.polling_rate: 10
hw.acpi.thermal.user_override: 0
hw.acpi.thermal.tz0.temperature: 22.5C
hw.acpi.thermal.tz0.active: -1
hw.acpi.thermal.tz0.passive_cooling: 1
hw.acpi.thermal.tz0.thermal_flags: 0
hw.acpi.thermal.tz0._PSV: 85.0C
hw.acpi.thermal.tz0._HOT: -1
hw.acpi.thermal.tz0._CRT: 100.0C
hw.acpi.thermal.tz0._ACx: 85.0C -1 -1 -1 -1 -1 -1 -1 -1 -1

In this example, there is only one thermal zone, and its temperature is 22.5C (72.5F).

From the acpi_thermal(4) man page:

     Number of seconds to continue active cooling once started.  A new
     active cooling level will not be selected until this interval

     Number of seconds between polling the current temperature.

     If set to 1, allow user override of various setpoints (below).
     The original values for these settings are obtained from the BIOS
     and system overheating and possible damage could occur if
     changed.  Default is 0 (no override).

     Current active cooling system state.  If this is non-negative,
     the appropriate _AC%d object is running.  Set this value to the
     desired active cooling level to force the corresponding fan
     object to the appropriate level.

     If set to 1, passive cooling is enabled.  It does cooling without
     fans using cpufreq(4) as the mechanism for controlling CPU speed.
     Default is enabled for tz0 where it is available.

     Current thermal zone status.  These are bit-masked values.

     Current temperature for this zone.

     Temperature to start passive cooling by throttling down CPU, etc.
     This value can be overridden by the user.

     Temperature to start critical suspend to disk (S4).  This value
     can be overridden by the user.

     Temperature to start critical shutdown (S5).  This value can be
     overridden by the user.

     Temperatures at which to switch to the corresponding active cooling
     level.  The lower the _ACx value, the higher the cooling power.

All temperatures are printed in Celsius.  Values can be set in Celsius
(by providing a trailing "C") or Kelvin (by leaving off any trailing letter).
When setting a value by sysctl(8), do not specify a trailing decimal (i.e.,
90C instead of 90.0C).

The defaults for these values are taken from the BIOS and some systems will not allow changes. The only way to know is to try. Before attempting to alter any of these values, set this OID:

sysctl -w hw.acpi.thermal.user_override=1

These values may be set by adding the appropriate lines for the OIDs to System > Advanced on the Tunables tab. Try setting them at run time:

sysctl -w hw.acpi.thermal.tz0._CRT=120C