Skip to main content

Undervolt Intel CPUs under Linux

Project description

Warning! This program is untested (apart from by myself) and it may damage your hardware! Use at your own risk.

undervolt Build Status

undervolt is a program for undervolting Intel CPUs under Linux. It works in a similar manner to the Windows program ThrottleStop (i.e, MSR 0x150). You can apply a fixed voltage offset to one of 5 voltage planes, override your systems temperature target (CPU will throttle when this temperature is reached), and adjust the system’s short and long power budgets (clocks and thus voltages will be altered in order to keep total power usage in these periods under the configured limits).

For more information, read here.

Installing

From PyPi:

$ pip install undervolt

From source:

$ pip install git+https://github.com/georgewhewell/undervolt.git

Note for custom kernel users: the module ‘msr’ (“CONFIG_X86_MSR”) must be enabled in the kernel options (Processor type & features -> Model-specific register support)

Examples

Read current offsets:

$ undervolt --read
temperature target: -25 (75C)
core: -110.35 mV
gpu: -49.8 mV
cache: -110.35 mV
uncore: -59.57 mV
analogio: -59.57 mV
powerlimit: 35.0W (short: 1.0s - enabled) / 35.0W (long: 1.0s - enabled)
turbo: enabled

Apply -100mV offset to CPU Core and Cache:

$ undervolt –core -100 –cache -100

Apply -75mV offset to GPU, -100mV to all other planes:

$ undervolt –gpu -75 –core -100 –cache -100 –uncore -100 –analogio -100

Set temperature target to 97C:

$ undervolt –temp 97

Set powerlimit 1 to 35W, 10s:

$ undervolt -p1 35 10

Set Intel Turbo disabled:

$ undervolt –turbo 1

Generated the command to run to recreate your Throttlestop settings:

$ undervolt --throttlestop ThrottleStop.ini --tsindex 3
undervolt --core -100.5859375
$ undervolt --throttlestop ThrottleStop.ini
undervolt --core -125.0 --gpu -125.0 --cache -125.0

Usage

$ undervolt -h
usage: undervolt.py [-h] [--version] [-v] [-f] [-r] [-t TEMP]
                    [--temp-bat TEMP_BAT] [--throttlestop THROTTLESTOP]
                    [--tsindex TSINDEX] [-p1 POWER_LIMIT TIME_WINDOW]
                    [-p2 POWER_LIMIT TIME_WINDOW] [--lock-power-limit]
                    [--core CORE] [--gpu GPU] [--cache CACHE]
                    [--uncore UNCORE] [--analogio ANALOGIO]

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -v, --verbose         print debug info
  -f, --force           allow setting positive offsets
  -r, --read            read existing values
  --turbo               Changes the Intel Turbo feature status (1 is disabled and 0 is enabled)
  -t TEMP, --temp TEMP  set temperature target on AC (and battery power if
                        --temp-bat is not used)
  --temp-bat TEMP_BAT   set temperature target on battery power
  --throttlestop THROTTLESTOP
                        extract values from ThrottleStop
  --tsindex TSINDEX     ThrottleStop profile index
  -p1 POWER_LIMIT TIME_WINDOW, --power-limit-long POWER_LIMIT TIME_WINDOW
                        P1 Power Limit (W) and Time Window (s)
  -p2 POWER_LIMIT TIME_WINDOW, --power-limit-short POWER_LIMIT TIME_WINDOW
                        P2 Power Limit (W) and Time Window (s)
  --lock-power-limit    Locks the set power limit. Once they are locked, they
                        can not be modified until next RESET (e.g., Reboot).
  --core CORE           offset (mV)
  --gpu GPU             offset (mV)
  --cache CACHE         offset (mV)
  --uncore UNCORE       offset (mV)
  --analogio ANALOGIO   offset (mV)

Running automatically on boot (systemd)

First, create a unit file /etc/systemd/system/undervolt.service with following contents, replacing the arguments with your own offsets:

[Unit]
Description=undervolt
After=suspend.target
After=hibernate.target
After=hybrid-sleep.target

[Service]
Type=oneshot
# If you have installed undervolt globally (via sudo pip install):
ExecStart=/usr/local/bin/undervolt -v --core -150 --cache -150 --gpu -100
# If you want to run from source:
# ExecStart=/path/to/undervolt.py -v --core -150 --cache -150 --gpu -100

[Install]
WantedBy=multi-user.target
WantedBy=suspend.target
WantedBy=hibernate.target
WantedBy=hybrid-sleep.target

Check that your script works:

$ systemctl start undervolt

Now you may enable undervolt service:

$ systemctl enable undervolt

Or, if you have issue with settings persistence, create a timer /etc/systemd/system/undervolt.timer to trigger the task periodically:

[Unit]
Description=Apply undervolt settings

[Timer]
Unit=undervolt.service
# Wait 2 minutes after boot before first applying
OnBootSec=2min
# Run every 30 seconds
OnUnitActiveSec=30

[Install]
WantedBy=multi-user.target

Now enable and start the timer:

$ systemctl enable undervolt.timer
$ systemctl start undervolt.timer

By including the OnBootSec command, settings will not be immediately applied. If you have set overly-aggressive offsets, you will have a short period to disable the timer before it crashes your system:

$ systemctl stop undervolt.timer

Now you can edit your undervolt.service before re-starting the timer.

Running automatically on boot (runit)

First, create a directory for the service:

$ sudo mkdir -p /etc/sv/undervolt

Then create a file named “run” in that directory and edit it to contain these contents:

#!/bin/sh
undervolt --core -85 --uncore -85 --analogio -85 --cache -85 --gpu -85
sleep 60

Replace the offsets with your own. Then mark the file as executable:

$ sudo chmod a+x /etc/sv/undervolt/run

Then enable the service:

$ sudo ln -s /etc/sv/undervolt /var/services/

Hardware support

Undervolting should work on any CPU later than Haswell.

System

CPU

Working?

Acer Aspire 7 (A715-71G)

i5-7300HQ

Yes

Acer Aspire E 15 (E5-575G)

i5-7200U

Yes

Acer Nitro 5

i5-7300HQ

Yes

Acer Nitro 5 (An515-52)

i5-8300H

Yes

Acer Predator (PH315-51)

i7-8750H

Yes

Acer Swift 7 (SF714)

i5-8200Y

Yes

Asus FX504GE

i7-8750H

Yes

Asus GL703GE

i7-8750H

Yes

Dell G5

i7-8750H

Yes

Dell G5 5590

i7-9750H

Yes

Dell Inspiron 5577

i7-7700HQ

Yes

Dell Inspiron 7560

i7-7500U

Yes

Dell Latitude 3301

i5-8265U

Yes

Dell Latitude 5400

i7-8665U

Yes

Dell Latitude 5480

i5-6300U

Yes

Dell Latitude 7390

i7-8650U

Yes

Dell Precision 5530

i9-8950HK

Yes

Dell Precision 7530

i9-8950HK

Yes

Dell Precision 7730

E-2176M

Yes

Dell Precision 7740

E-2286M

Yes

Dell Precision M3800

i7-4712HQ

Yes

Dell XPS 13 9343

i5-5200U

Yes

Dell XPS 13 9350

i7-6560U

Yes

Dell XPS 13 9360

i7-7560U

Yes

Dell XPS 15 7590

i7-9750H

Yes

Dell XPS 15 7590

i9-9980HK

Yes

Dell XPS 15 9530

i7-4712HQ

Yes

Dell XPS 15 9550

i7-6700HQ

Yes

Dell XPS 15 9560

i7-7700HQ

Yes

Dell XPS 15 9570

i9-8950HK

Yes

Dell XPS 15 9575

i7-8705G

Yes

HP Omen 17-an061ur

i7-7700HQ

Yes

HP Spectre X360

i7-8809G

Yes

HP Zbook Studio G5

i7-8750H

Yes

Intel NUC7i3BNK

i3-7100U

Yes

Lenovo AIO Y910 27ISH

i7-6700

Yes

Lenovo IdeaCentre Q190

1017U

No

Lenovo Thinkpad T430

i7-3610QM

No

Lenovo Thinkpad T440p

i5-4300M

Yes

Lenovo Thinkpad T470p

i7-7700HQ

Yes

Lenovo Thinkpad T470p

i7-7820HQ

Yes

Lenovo Thinkpad T480s

i5-8250U

Yes

Lenovo Thinkpad T490

i5-8265U

Yes

Lenovo Thinkpad X1 Carbon

i7-6600U

Yes

Lenovo Thinkpad X1 Extreme

i7-8750H

Yes

Lenovo Thinkpad X1 Extreme Gen 2

i7-9750H

Yes

Lenovo Thinkpad x250

i7-5600U

Yes

Lenovo X1 Gen 5

i7-7500U

Yes

Lenovo X1 Yoga Gen 2

i7-7600U

Yes

Lenovo Yoga 920

i7-8550U

Yes

MSI GE60 2QD Apache

i7-4720HQ

Yes

MSI GP73 Leopard 8RF

i7-8750H

Yes

MacBook Air Late 2015

i5-5250U

Yes

MacBook Air Mid 2013

i5-4250U

Yes

Toshiba Chromebook 2

N2840

No

Troubleshooting

  • Core or Cache offsets have no effect. It is not possible to set different offsets for CPU Core and Cache. The CPU will take the smaller of the two offsets, and apply that to both CPU and Cache. A warning message will be displayed if you attempt to set different offsets.

  • OSError: [Errno 1] Operation not permitted First try running with sudo. If the error persists, your system is probably booted in Secure Boot mode. In this case, the Linux kernel will prevent userspace programs (even as root) from writing to the CPU’s model-specific registers. Disable UEFI Secure Boot in your system’s BIOS and the error should go away.

  • Undervolt has no effect - Your device BIOS might be blocking it. Check the wiki (https://github.com/georgewhewell/undervolt/wiki) to find notes for your hardware

GUI

There is also a small gui written in Java avaiable here: https://github.com/zmalrobot/JavaLinuxUndervolt

It will allow you to set each value core, gpu, cache, uncore, analogio (temperature target isn’t implemented yet),save a profile, load a profile and reset the value.

Credit

This project is a trivial wrapper around the work of others from the following resources:

Many thanks to all who contributed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

undervolt-0.4.0.tar.gz (10.7 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page