1. Introduction

The Central Processing Unit (CPU) is the main hardware unit on a computer that is responsible for executing instructions from programs. Because of that, the speed of the CPU has a significant impact on the system’s performance.

In this article, we will learn how to get both the base and real-time CPU speed information on Linux. There are various command-line utilities and scripts we can use to get the speed of our CPU.

2. CPU Speed

CPU speed is defined as clock speed or clock rate. The clock rate indicates the processing frequency of a processor. In other words, it determines how many instructions a CPU can interpret per second. Since modern processors are very fast, the clock speed is usually defined as MHz or GHz.

In general, a CPU has a base speed which can be seen from the hardware specifications. However, in practice, the clock rate is most often higher than this rate, and it might vary from time to time.

3. Inspecting /proc/cpuinfo File

The first method we can use to find CPU speed is reading the virtual file /proc/cpuinfo. In this file, there is a lot of information regarding the CPU. Since we are looking only for the clock speed, we can directly filter the information we need:

$ cat /proc/cpuinfo | grep Hz
model name    : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
cpu MHz        : 2904.004
model name    : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
cpu MHz        : 2904.004

As we mentioned previously, there are base and real-time clock speeds. In this case, these values are 2.70 GHz and 2904.004 MHz, respectively.

Furthermore, the reason there are two outputs is that this file displays CPU information for each processor core. So, it means that there are two cores in this particular system that gives the above output. In this example, the clock rates are the same for both cores.

If we want to monitor the speed for some period of time, we can use the watch command:

$ watch -n1 "grep Hz /proc/cpuinfo"

Every 1.0s: grep Hz /proc/cpuinfo                                                                baeldung: Sun Jun 26 16:21:32 2022

model name      : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
cpu MHz         : 2904.004
model name      : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
cpu MHz         : 2904.004

The above output will refresh every second. We can change the period by modifying the value after the -n option.

4. Using lscpu

We can also use the lscpu command-line utility to retrieve the CPU speed. lscpu collects the general CPU architecture information from the /proc/cpuinfo virtual file and the sysfs pseudo-file system.

Again, since we are not interested in all of the information about the CPU, we filter the output so that we get the speed information we’re looking for:

$ lscpu | grep CPU
CPU op-mode(s):                  32-bit, 64-bit
CPU(s):                          2
On-line CPU(s) list:             0,1
CPU family:                      6
Model name:                      Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
CPU MHz:                         2904.000
NUMA node0 CPU(s):               0,1
Vulnerability Mds:               Mitigation; Clear CPU buffers; SMT Host state unknown
Vulnerability Mmio stale data:   Mitigation; Clear CPU buffers; SMT Host state unknown

As we can see from the output of lscpu, the results are 2.70 GHz and 2904.004 MHz, just like before.

5. Looking at the Kernel Message Buffer With dmesg

dmesg is a command that prints message buffers generated by the kernel and device drivers. Similarly to previous methods, we can get the CPU speed information by filtering out the output of dmesg:

$ dmesg | grep Hz
[    0.000016] tsc: Detected 2904.004 MHz processor
[    0.238892] smpboot: CPU0: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz (family: 0x6, model: 0x8e, stepping: 0x9)
...

Here, we got the 2904.004 MHz clock rate, and we saw the CPU with a 2.70 GHz base frequency, like with the previous methods. Note that there may be some irrelevant outputs for the above command.

6. Parsing the SMBIOS Data With dmidecode

dmidecode is a tool that parses the System Management BIOS (SMBIOS) data in a human-readable format. SMBIOS provides data structures to get access to the information about the hardware components of a system, such as memory devices or processors, as well as the BIOS management.

$ sudo dmidecode -t processor | grep Hz 
    Version: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
    External Clock: 100 MHz
    Max Speed: 2900 MHz
    Current Speed: 2600 MHz

This time, the output is slightly different from others. Besides, we may want to keep in mind that dmidecode could sometimes give unreliable results because it extracts the data from SMBIOS tables instead of probing the actual hardware.

7. Utilizing the inxi Script

Another way to get CPU speed information is to use the inxi script. inxi can provide a variety of useful pieces of information from drivers to the kernel, but we are only interested in the CPU information. In order to use inxi, we need to install it with our package manager.

Let’s take a look at what types of information the script returns about the CPU:

$ sudo inxi -c
CPU: Dual Core Intel Core i7-7500U (-MCP-) speed: 2904 MHz Kernel: 5.13.0-51-generic x86_64 Up: 22m 
Mem: 465.6/971.2 MiB (47.9%) Storage: 20.00 GiB (50.7% used) Procs: 201 Shell: bash 5.0.17 inxi: 3.0.38

Above, we used -c to retrieve data about the CPU. Correspondingly, we observe that the CPU speed is 2904 MHz.

8. Using the Hardware Level Information Tool hwinfo

hwinfo logs some useful information about general hardware in the system. We can install this manually too, by simply using our package manager.

After that, in a similar fashion to the other methods, we can use hwinfo to get the CPU speed:

$ hwinfo --cpu | grep Hz
  Model: 6.142.9 "Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz"
  Clock: 2904 MHz
  Model: 6.142.9 "Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz"
  Clock: 2904 MHz

As can be seen above, we got both the base and current clock speeds as 2.70 GHz and 2904 MHz like before.

9. Using i7z for Intel Processors

i7z is a basic utility that reports processor data, but only about Intel Core CPUs. After installing the package, we can see some real-time status information for every core:

$ sudo i7z
Cpu speed from cpuinfo 2903.00Mhz
cpuinfo might be wrong if cpufreq is enabled. To guess correctly try estimating via tsc
Linux's inbuilt cpu_khz code emulated now
True Frequency (without accounting Turbo) 2903 MHz
  CPU Multiplier 29x || Bus clock frequency (BCLK) 100.10 MHz

Socket [0] - [physical cores=2, logical cores=2, max online cores ever=2]
  TURBO DISABLED on 2 Cores, Hyper Threading OFF
  Max Frequency without considering Turbo 2903.00 MHz (100.10 x [29])
  Max TURBO Multiplier (if Enabled) with 1/2/3/4 Cores is  42x/42x/42x/42x
  Real Current Frequency 0.00 MHz [100.10 x 0.00] (Max of below)
        Core [core-id]  :Actual Freq (Mult.)      C0%   Halt(C1)%  C3 %   C6 %  Temp      VCore
        Core 1 [0]:       inf (infx)       0     100       0       0    -1      1.9349
        Core 2 [1]:       inf (infx)       0     100       0       0    -1      1.9349
...

When we inspect the output, we see that the true frequency of the CPU is 2903 MHz. As we mentioned previously, the true frequency may vary in real-time. Hence this slight difference is not a problem.

10. Conclusion

In this article, we learned what a CPU is and what its speed means. We saw the difference between the base and true frequency and used several methods to retrieve the clock speed information.