Εισαγωγή στον υπερχρονισμό σε Linux (Intel i5/i7)

overclocking
advanced
#1

Σαν κίνητρο, παραθέτω τα αποτελέσματα του Geekbench4 στο μηχάνημά μου:

Όπως φαίνεται εκ των αποτελεσμάτων, ο υπερχρονισμός στο Linux όχι μόνο είναι εφικτός, αλλά και με διαφορά καλύτερος από Windows. Ο λόγος επ’ αυτού θα φανεί μέχρι το τέλος του παρόντος οδηγού.
Ας αρχίσουμε!

Προσοχή! Το άρθρο που ακολουθεί είναι το απόσταγμα πολλαπλών ΑΠΟΤΥΧΙΩΝ και προσπαθιών στη διάρκεια ετών εμπειρίας στο θέμα του υπερχρονισμού. Μπορεί να έχει κάμποσα λάθη, οπότε μην διστάσετε να τα αναφέρετε ώστε να μπορέσω να τον εμπλουτίσω στην πορεία.

Προαπαιτούμενα

  1. Υπερχρονίσιμoς Επεξεργαστής (συνήθως i5/i7 XXXX K )
  2. Ανάλογο BIOS:
    Πριν προχωρήσουμε, βεβαιωθείτε ότι το BIOS σας υποστηρίζει εγγενώς υπερχρονίσιμους επεξεργαστές. Αυτό συνήθως σημαίνει 2 πράγματα: Το BIOS μπορεί να γίνει reset εύκολα σε περίπτωση λάθος - μη σταθερών - ρυθμίσεων ρολογιού καθώς και να μπορεί να κάνει μονο του reset σε περίπτωση laptop. Για παράδειγμα, το σύνηθες είναι να μην γίνεται αυτό σε laptop BIOS’s (Dell’s Alienwares), με μικρές εξαιρέσεις (MSI/Asus). Προσοχή λοιπόν μην φτάσεται να έχετε τουβλο αντί για υπολογιστή…
  3. Προφανώς εγκατάσταση Linux
    – Στα πλαίσια του παρόντος οδηγού υποθέτω debian-based διανομές, αν και τα περισσότερα βήματα είναι ίδια
  4. Να έχετε κατεβάσει το datasheet του επεξεργαστή σας. Συνήθως είναι διαθέσιμο στο https://www.intel.com/content/www/us/en/products/docs/processors/core/core-technical-resources.html
  5. Βασικές γνώσεις προγραμματισμού και μετατροπής βάσεων (δυαδικό σε δεκαδικό σε δεκαεξαδικό κλπ) και βασικές γνώσεις αρχιτεκτονικής υπολογιστών

Γενικές κατευθύνσεις και Πληροφορίες

  1. Λόγω των ανωτέρω περιορισμών σε κάποιες μονάδες BIOS και του κατα συνέπεια κινδύνου, θα κάνουμε υπερχρονισμό μέσα από το λειτουργικό μας σύστημα
    2… Αυτό σημαίνει ότι θα είναι αρκετά πιο περίιπλοκο, αλλά πολύ πιο ασφαλές, καθώς ένα reset επαρκεί για να γίνει επαναφορά στις μαμά ρυθμίσεις
  2. Στα Windows, το Intel XTU είναι το σύνηθες εργαλείο υπερχρονισμού και αλλαγής παραμέτρων turbo-boost και TDP. Στα Linux, δεν υπάρχουν φιλικά εργαλεία (καλύτερα κατά τη γνώμη μου). Κατ’επέκταση θα επέμβουμε άμεσα στους καταχωρητές MSR (Model-Specific Registers).
  3. ΜΗΝ δελεαστείτε να κάνετε αλλαγές απο το BIOS, ειδικά αν δεν έχετε PC η κάποιο Gaming Laptop που να υποστηρίζει υπερχρονισμό. Απ’ όσο ξέρω μόνο τα MSI GT series, ASUS ROG series,SAGER and EUROCOM υποστηρίζουν σωστά υπερχρονισμό.
  4. Αν τυχόν έχετε ένα από τα παραπάνω μηχανήματα, μπορούμε να επέμβουμε, πέραν του επεξεργαστή, και στη Μνήμη αλλάζοντας το ρολόι και τους χρονισμούς της για ακόμα καλύτερα αποτελέσματα
  5. Για να επιτευχθεί σωστά η ρύθμιση της Μνήμης, η μητρική ΠΡΕΠΕΙ να υποστηρίζει το πρωτόκολλο XMP.
  6. P-states
    Με την έκδοση 3.9 του πυρήνα του Linux προστέθηκε ο καινούριος οδηγός επεξεργαστών intel, ο intel_pstate. Αρχικά υποστήριζε μόνο τους SandyBridge(2nd generation), αλλά αργότερα προστέθηκαν και οι νεότερες γεννιές επεξεργαστών, μέχρι και την τελευταία.
    Ο συγκεκριμένος οδηγός υποστηρίζει το καινούριο σύστημα θερμικού ελέγχου των μοντέρνων επεξεργαστών της Intel και το όνομά του έρχεται από τα P-states.
    Τα P-states είναι ουσιαστικά η δυνατότητα του επεξεργαστή να τρέχει σε διαφορετικά επίπεδα (states) τάσης και ισχύος/συχνότητας. Το Ρ0 είναι το μέγιστο σε ταχύτητα, με τα Ρ1 κλπ να ακολουθούν με μειωμένη απόδοση.
  7. Καταστάσεις Ηρεμίας: C-states
    Τα C-states είναι καταστάσεις εξοικονόμησης ισχύος, σε αντίθεση με τα Ρ-states. Κατά τη διάρκεια των C-states ο επεξεργαστής κάθεται σε ηρεμία και δεν εκτελούνται εντολες.
    C-states:
    -C0 είναι το μόνο operational state, δηλαδή ο επεξεργαστής κάνει κάτι (εκτελεί εντολές)
    -C1 η πρώτη κατάσταση ηρεμίας
    -C2 η 2η κατάσταση ηρεμίας: Ο εξωτερικός ελεγκτής I/O μπλοκάρει τις “Διακοπές” (interrupts) προς τον επεξεργαστή
    -κλπ

Βήμα Πρώτο

  1. Εγκατάσταση του cpufrequtils
    void@msi:~$ sudo apt install cpufrequtils
  2. Προβολή μοντέλου και χαρακτηριστικών Επεξεργαστή
    void@msi:~$ cpupower frequency-info
    Το αποτέλεσμα πρέπει να είναι ως κάτωθι:

analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
hardware limits: 800 MHz - 3.80 GHz
available cpufreq governors: performance powersave
current policy: frequency should be within 800 MHz and 3.80 GHz.
The governor “powersave” may decide which speed to use
within this range.
current CPU frequency: Unable to call hardware
current CPU frequency: 913 MHz (asserted by call to kernel)
boost state support:
Supported: yes
Active: yes

Τώρα βεβαιωθείτε ότι το cpu driver γράφει δίπλα intel_pstate και ότι ο perfrormance governor είναι διαθέσιμος σαν επιλογή. Η απενεργοποίηση του pstate driver είναι εφικτή (με παράμετρο στο boot) αλλά δεν συνίσταται, καθώς ο pstate driver είναι συνήθως πιο αποδοτικός από την εναλλακτική (acpi_cpufreq)

Βήμα Δεύτερο
Τα δύσκολα…

Για να πετύχουμε σωστό υπερχρονισμό, θα ελέγξουμε άμεσα τον πολλαπλασιαστή συχνοτήτων των πυρήνων, τις τάσεις τροφοδοσίας τους και το όριο Θερμικής Ισχύος TDP. Πριν προχωρήσουμε, πρέπει να εξηγήσω τα βασικά του πως ελέγχεται ένας επεξεργαστής Intel πρωτογενώς.
Κάθε επεξεργαστής έχει κάποιους ειδικούς καταχωρητές, τους Model Specific Registers, or MSR’s, οι οποίοι δίνουν στο λειτουργικό σύστημα και κατ’ επέκταση μέσα από κλήσης συστήματος, στο χρήστη τη δυνατότητα να ελέγξει διάφορες παραμέτρους, μέσω του hypervisor. Π.χ. συχνότητες, τάσεις, ισχύ, θερμικά ορια, ΙΟ κλπ.
Υπάρχουν συνήθως πολλοί MSR, κάποιοι Read Only, κάποιοι Read-Write και κάποιοι Write only, ανάλογα φυσικά με τη λειτουργία που εκτελούν και το μοντέλο επεξεργαστή.
Αντίθετα από τους κλασσικούς καταχωρητές, οι MSR διευθυνσιοδοτούνται σε ένα ειδικό εύρος διευθύνσεων, ορισμένο από τον κατασκευαστή στο εγχειρίδιο (datasheet) και μπορούν να ελεχθούν με τις εντολές Χ86 wrmsr και rdmsr.
Ευτυχώς για εμάς υπάρχει εργαλείο, διαθέσιμο σίγουρα σε Debian κ σε άλλες διανομές, το msr-tools, που μας δίνει τη δυνατότητα να το κάνουμε από τη γραμμή εντολών.
Οπότε, ας το εγκαταστήσουμε:
void@msi:$ sudo apt install msr-tools
Στη συνέχεια βεβαιωνόμαστε ότι θα φορτώνεται το ανάλογο kernel module:
void@msi:$ sudo echo msr > /etc/modules-load.d/msr.conf

Τώρα έχουμε πρόσβαση στα rdmsr and wrmsr από τη γραμμή εντολών, ως ακολούθως
Διαβάζουμε έναν MSR με το rdmsr 0x(address) και γράφουμε σε έναν MSR με το wrmsr 0x(address) 0x(value) . Όταν διαβάζουμε, μπορούμε να ορίζουμε bitmasks με το διακόπτη -f 15:0 (από το bit 0 ως το bit 15, αντιστρόφως).

Βήμα Τρίτο
Τα ακόμα πιο δύσκολα

Δυστυχώς, αντίθετα από τα windows, που έχουμε το Intel XTU, εδώ θα πρέπει να τροποποιήσουμε τους ανάλογους MSR.
Από εδώ και πέρα θα θεωρείται ότι έχετε διαβάσει το datasheet και ότι έχετε βρει τις διευθύνσεις των εν λόγω καταχωρητών και τη λειτουργία αυτών.
Κάποιες από αυτές, μπορεί και όλες, θα είναι ίδιες με τις δικές μου.

Υποθέτουμε λοιπόν τις παρακάτω διευθύνσεις:

  1. Voltage control
    -MSR_ADDR_VOLTAGE(RW) 0x150
  2. Power control
    -MSR_RAPL_POWER_UNIT(RO) 0x606
    -MSR_PKG_POWER_LIMIT(RW) 0x610
  3. Turbo Boost control
    -MSR_PLATFORM_INFO(RO) 0x0CE
    -MSR_TURBO_RATIO_LIMIT(RW) 0x1AD

Παρόλο που η διαδικασία αλλαγής των τιμών των MSR αναλύεται στο datasheet σε διάφορα σημεία του, θα προσπαθήσω να την εξηγήσω σε ένα βαθμό, καθώς είναι αρκετά διάσπαρτη η πληροφορία.

Power/Energy/Time units

MSR_RAPL_POWER_UNIT
3:0 = Power unit (W) = 1/2^(decimal)W - default: 0.125 Watts
12:8 = Energy unit (J) = 1/2^(decimal)J - default: 0.00006103515625 Joules
19:16 = Time unit (sec) = 1/2^(decimal)sec - default: 0.0009765625 Seconds

Package power limits

MSR_PKG_POWER_LIMIT
14:0 = Pkg power limit = Powerunit * decimal
15:15 = Pkg power enabled - boolean
16:16 = Pkg clamping limit - boolean
23:17 = Pkg power limit time window = 2^(21:17 bit) * (1.0 + (23:22 bit)/4.0 ) * Timeunit

46:32 = Pkg power limit 2 = Powerunit * decimal
47:47 = Pkg power 2 enabled - boolean
48:48 = Pkg clamping limit 2 - boolean
55:49 = Pkg power limit time window = 2^(53:49 bit) * (1.0 + (55:54 bit)/4.0 ) * Timeunit

63:63 = MSR lock - boolean

Turbo boost ratio limit

MSR_PLATFORM_INFO
15:8 = Maximum non-turbo - boolean
28 = Programmable ratio limit for turbo - boolean
29 = Programmable TDP limit for turbo - boolean
30 = Programmable TJ offset - boolean

MSR_TURBO_RATIO_LIMIT
7:0 = Ratio For 1 active Core
15:8 = Ratio 2 active Cores
23:16 = Ratio 3 active Cores
31:24 = Ratio 4 active Cores

Βήμα Τέταρτο
Το “ωραίο” κομμάτι

Χρησιμοποιώντας τις παραπάνω πληροφορίες, μπορούμε πλέον να πειράξουμε τις τιμές των MSR με την παρακάτω εντολή (γενική μορφή):

void@msi:#wrmsr [addr] 0x[hex value]

Ο επεξεργαστής μου έχει από το εργοστάσιο πολλαπλασιαστή 38 σε τουρμπο όταν λειτουργούν και οι 4 πυρήνες. Αυτό το αλλάζω σε 44. Ταυτόχρονα, θα αλλάξω το 25W όριο ισχύος σε 200 με απεριόριστη διάρκεια (1073741824 δευτερόλεπτα) “τουρμπίσματος”.

ΑΠΟ
void@msi:# rdmsr 0x610
42819800dd80b8h

void@msi:# rdmsr 0x1AD
26262626

ΣΕ
void@msi:# rdmsr 0x610
428c8000dd8c80

void@msi:# rdmsr 0x1AD
2C2C2C2C

Βημα Πέμπτο
Κλέβοντας το Benchmark

Μέχρι τώρα αλλάξαμε τους πολλαπλασιαστές συχνότητας και τα όρια TDP, κάτι που λογικά θα κάνει τεράστια διαφορά από μόνο του. Αλλά, λόγω του τρόπου λειτουργίας του πυρήνα του λειτουργικού μας, όταν τρέχουμε το benchmark, θα τρέχει με μεσαία προτεραιότητα. Δεν το θέλουμε αυτό αν θέλουμε καλά νούμερα. Ευτυχώς αυτό αλλάζει εύκολα με τον παρακάτω τρόπο:

void@msi:#chrt --rr 99 geekbench4

Βήμα Έκτο
Ο αριθμός του θηρίου

Ευχαριστώ για την υπομονή των αναγνωστών μέχρι εδώ!

Υ.Γ. Έχω σκοπίμως παραλήψει κάποια βήματα, τα οποία θα προσθέσουν άλλο ένα 15% απόδοση, γιατί ενέχουν κινδύνους.
Παρακαλώ τους αναγνώστες να παραθέσουν τα αποτελέσματά τους και κάποια στιγμή θα ακολουθήσουν και τα “κρυφά” αυτά βήματα…

Απολαύστε ανεύθυνα!

English Version:

As a motivation, i ll start by linking my Geekbench 4 results :

As we can see, overclocking in Linux is not only achievable, but by far superior to Windows.
The reason will be apparent by the end of this guide. Lets begin!

Warning! This article is a summary of what I learned over the years of overclocking. It may be full of mistakes, don’t hesitate to report them, so that I can enhance it!

Prerequisites:

  1. An overclockable CPU (usually i5/i7 XXXX K )
  2. An overclock supporting BIOS:
    Before proceeding, please make sure your BIOS has native support for overclockable CPU’s. This means two things: The BIOS can easily be reset and/or it can reset itself in case of wrongly configured clocks. For example, laptop BIOS’s are usually very hard to reset (Dell’s Alienwares), with few exceptions (MSI/Asus). So beware, you might soft-brick your laptop.
  3. Obviously a Linux Distro of your choice.
    – This guide will assume a debian-based distro for the sake of reference, but most steps are identical across distros –
  4. You CPU’s datasheet. You can find it in Intel’s official site, i.e. https://www.intel.com/content/www/us/en/products/docs/processors/core/core-technical-resources.html
    You’ll need to read the datasheet in order to find the MSR addresses and specs. More on this later on on this guide.
  5. Basic programming and number base conversion knowledge (binary - decimal - hex) as well as a good understanding of basic computer systems architecture

General Directions and Information

  1. Due to the aforementioned limitations of some BIOS’s and the danger of soft/hard-bricking your laptop, we will be Overclocking from WITHIN our Operating System.
  2. This means it will be harder to do, but by far safer, as in case of crashes (which will be many), you can simply reset your laptop without having to reconfigure stuff in BIOS.
  3. On Windows, Intel XTU can be used for modifying turbo-boost parameter and TDP related settings. But on Linux, there are no user friendly tools available. In this article, I will be directly modifying MSR (Model-Specific Registers) to achieve similar results.
  4. Do NOT be tempted to do it from BIOS, especially if you are not on a PC or a Gaming Laptop that supports overclocking properly. AFAIK Only MSI GT series, ASUS ROG series,SAGER and EUROCOM laptops support it.
  5. If you happen to own one of the above, we can go further than changing only the CPU clocks and also change RAM clocks and timings, thus achieving even greater performance.
  6. To properly change RAM clocks and timings (If you fall in the above category) your motherboard MUST support XMP.
  7. P-states
    A new CPU driver intel_pstate was added to the Linux kernel 3.9 (April 2009). First, it only supported SandyBridge CPUs (2nd generation), Linux 3.10 extended it to Ivybridge generation CPUs (3rd gen), and so on and so forth.
    This driver supports recent features and thermal control of modern Intel CPUs. Its name comes from P-states.
    The processor P-state is the capability of running the processor at different voltage and/or frequency levels. Generally, P0 is the highest state resulting in maximum performance, while P1, P2, and so on, will save power but at some penalty to CPU performance.
  8. Idle states: C-states
    C-states are idle power saving states, in contrast to P-states, which are execution power saving states.
    During a P-state, the processor is still executing instructions, whereas during a C-state (other than C0), the processor is idle, meaning that nothing is executing.
    C-states:
    -C0 is the operational state, meaning that the CPU is doing useful work
    -C1 is the first idle state
    -C2 is the second idle state: The external I/O Controller Hub blocks interrupts to the processor.
    -etc.

Step One

  1. Install cpufrequtils
    void@msi:~$ sudo apt install cpufrequtils
  2. Verify your CPU model
    void@msi:~$ cpupower frequency-info
    Your output should look something like this:

analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
hardware limits: 800 MHz - 3.80 GHz
available cpufreq governors: performance powersave
current policy: frequency should be within 800 MHz and 3.80 GHz.
The governor “powersave” may decide which speed to use
within this range.
current CPU frequency: Unable to call hardware
current CPU frequency: 913 MHz (asserted by call to kernel)
boost state support:
Supported: yes
Active: yes

Now, verify that your cpu driver is intel_pstate and that you have the perfrormance governor as an available choice. You can of course disable the pstate driver, but i really do not recommend this as pstate is usually faster than the alternatives (acpi_cpufreq).

Step Two
The hardcore stuff

To overclock properly, we will be controlling the CPU’s frequency multipliers, core voltages and TDP limits.
Before we proceed, i feel i must explain the basics of how an Intel (And others) CPU is controlled.
Every CPU has some special Registers, called Model Specific Registers, or MSR’s, which give the Operating System and, by extension through system calls, the user control over the processor’s hypervisor functions. I.E. frequencies, voltages, power, temperature and throttling, IO pin control and others.
There are usually many MSR’s available, some Read Only, some Read-Write and some Write only, depending on the function and of course, the CPU model.
Unlike regular registers, MSR’s are exposed at special address ranges, defined in each CPU’s datasheet, and can be controlled by the wrmsr and rdmsr X86 instructions.
Luckilly, the is a command line tool, available in Debian, called msr-tools, which wraps these functions in a CLI.
So, first install it:
void@msi:$ sudo apt install msr-tools
Then, make sure the proper kernel module is loaded on startup, by issuing
void@msi:$ sudo echo msr > /etc/modules-load.d/msr.conf

Now we have access to rdmsr and wrmsr command line tools, as follows:
You can read from MSR with rdmsr 0x(address) and write to MSR with wrmsr 0x(address) 0x(value) . When reading, you can specify bitmasks by -f 15:0 (from bit 0 to bit 15, in reverse).

Step Three
The even more hardcore stuff

Unfortunately, unlike windows, where there is a tool available, i.e. Intel XTU, in Linux we ll have to emulate its functions by directly modifying our CPU’s MSR’s.
I will from now on assume you have read the datasheet and found the proper MSR addresses. Some of these addresses, or maybe all of them, will be the same as mine.
MSR Addresses assumptions:

  1. Voltage control
    -MSR_ADDR_VOLTAGE(RW) 0x150
  2. Power control
    -MSR_RAPL_POWER_UNIT(RO) 0x606
    -MSR_PKG_POWER_LIMIT(RW) 0x610
  3. Turbo Boost control
    -MSR_PLATFORM_INFO(RO) 0x0CE
    -MSR_TURBO_RATIO_LIMIT(RW) 0x1AD
    Even though the control procedure of the above MSR’s is detailed within the datasheet in various pages, i ll explain some of them as best i can, as they are hard to figure out:

Power/Energy/Time units

MSR_RAPL_POWER_UNIT
3:0 = Power unit (W) = 1/2^(decimal)W - default: 0.125 Watts
12:8 = Energy unit (J) = 1/2^(decimal)J - default: 0.00006103515625 Joules
19:16 = Time unit (sec) = 1/2^(decimal)sec - default: 0.0009765625 Seconds

Package power limits

MSR_PKG_POWER_LIMIT
14:0 = Pkg power limit = Powerunit * decimal
15:15 = Pkg power enabled - boolean
16:16 = Pkg clamping limit - boolean
23:17 = Pkg power limit time window = 2^(21:17 bit) * (1.0 + (23:22 bit)/4.0 ) * Timeunit

46:32 = Pkg power limit 2 = Powerunit * decimal
47:47 = Pkg power 2 enabled - boolean
48:48 = Pkg clamping limit 2 - boolean
55:49 = Pkg power limit time window = 2^(53:49 bit) * (1.0 + (55:54 bit)/4.0 ) * Timeunit

63:63 = MSR lock - boolean

Turbo boost ratio limit

MSR_PLATFORM_INFO
15:8 = Maximum non-turbo - boolean
28 = Programmable ratio limit for turbo - boolean
29 = Programmable TDP limit for turbo - boolean
30 = Programmable TJ offset - boolean

MSR_TURBO_RATIO_LIMIT
7:0 = Ratio For 1 active Core
15:8 = Ratio 2 active Cores
23:16 = Ratio 3 active Cores
31:24 = Ratio 4 active Cores

Step Four
The fun part

Using above information, we can now change the MSRs accordingly, using

void@msi:#wrmsr [addr] 0x[hex value]

Since my processor was limited to 38 boost ratio when all 4 cores are active, I changed that limitation to 44. Also, I changed the 25W limit to 200W with unlimited (1073741824 seconds) boost duration.

FROM
void@msi:# rdmsr 0x610
42819800dd80b8h

void@msi:# rdmsr 0x1AD
26262626

To
void@msi:# rdmsr 0x610
428c8000dd8c80

void@msi:# rdmsr 0x1AD
2C2C2C2C

Step Five
Benchmark Cheats

So far, we changed our CPU’s multipliers and TDP limits, which should make a significant difference alone.
But, due to the way the linux kernel preemption works, everytime we run a benchmark, it will run with a medium CPU scheduler priority. We dont want that. So, regarding geekbench4 for example, we are going to be running it with RealTime priority with

void@msi:#chrt --rr 99 geekbench4

Step Six
The number of the (CPU) beast

If you followed this guide so far, i MUST thank you.

PS. I have omitted a couple of optimization steps that will add a 15% performance bonus, as they are a tiny bit dangerous.
So, post your questions and results and if I feel you are ready i will follow up with these two bonuses!

Cheers.

7 Likes
#2

Αν μπορείς κάνε ένα κόπο να το μεταφράσεις στα ελληνικά. Το forum απευθύνεται σε Έλληνες :blush:

1 Like
#3

Δεσμευμένη θέση για τη συνέχεια του οδηγού
*Θα αφορά αναλυτικό έλεγχο του pstate driver μέσα από sysfs και άλλα *

#4

Κάτι σε undervolt για CPU/GPU έχεις για μας τους άσχετους ; :stuck_out_tongue: (αναλυτικότατος ο οδηγός !)

#5

Αυτό είναι κάτι λυμένο, δες το https://github.com/kitsunyan/intel-undervolt
Πανέυκολο στη χρήση και με καλό documentation…

1 Like