In a pervious article we discussed about the important cpu performance metrics like usage, temperature, power and clock frequency. In this article we shall take a look at various methods of monitoring the same on Ubuntu or similar linux distros.
There are quite a few commands on linux for monitoring cpu metrics. If you just want to see the cpu usage, you can use the System Monitor which is available on both gnome and kde desktops.
For more details like the clock frequency, temperature etc, use the commands shown below.
1. Turbostat
$ sudo turbostat --Summary --quiet --show Busy%,Avg_MHz,PkgTmp,PkgWatt --interval 1
$ sudo turbostat --Summary --quiet --show Busy%,Avg_MHz,Bzy_MHz,TSC_MHz,PkgTmp,PkgWatt --interval 1 Avg_MHz Busy% Bzy_MHz TSC_MHz PkgTmp PkgWatt 188 5.54 3392 3000 70 10.75 314 9.21 3408 3000 66 12.73 236 6.95 3394 3000 63 11.63 320 9.38 3411 3000 63 13.17 287 8.41 3413 3000 65 12.33 361 10.70 3371 3000 63 12.74 298 8.76 3404 3000 64 12.23 281 8.22 3415 3000 63 12.20 515 15.23 3380 3000 65 15.27 1404 42.30 3319 3000 75 23.06 3300 100.00 3300 3000 76 40.66 3300 100.00 3300 3000 76 40.87 3300 100.00 3300 3000 77 40.92 3300 100.00 3300 3000 78 41.05 3300 100.00 3300 3000 78 41.13
There are 3 different columns for frequency: Avg_MHz, Bzy_MHz, TSC_MHz. The Avg_MHz fluctuates in real-time as per the load on the cpu. This is the actual average frequency. The Bzy_Mhz measures the frequency of those cycles when the cpu is under load. The TSC_MHz field seems to indicate the base clock frequency of the processor.
The turbostat command can be combined with ttyplot to generate nice terminal graphs. With multi-tab terminals like Konsole you can view each graph in its own tab.
Monitor CPU Load graph: The following command will monitor the Busy% column of the turbostat output and plot it using ttyplot to generate a nice graph indicating the cpu load over time.
sudo turbostat --Summary --quiet --show Busy% --interval 1 | ttyplot -s 100 -t "Turbostat - CPU Usage/Load" -u "%cpu"
Monitor cpu clock graph
The cpu clock speed is the frequency and is measured in Mhz or Ghz.
$ sudo turbostat --Summary --quiet --show Avg_MHz --interval 1 | gawk '{ printf("%.2f\n" , $1); fflush(); }' | ttyplot -s 100 -t "Turbostat - CPU Clock (Mhz)" -u "Mhz"
Turbostat actually has multiple fields related to the clock frequency which are:
Avg_Mhz Bzy_Mhz TSC_Mhz
To learn more about each of the measurement check the turbostat man page. The Avg_Mhz is what indicates the actual average frequency over equal sized time durations.
Monitor the CPU temperature graph
$ sudo turbostat --Summary --quiet --show PkgTmp --interval 1 | gawk '{ printf("%.2f\n" , $1); fflush(); }' | ttyplot -s 100 -t "Turbostat - CPU Temp (C)" -u "C"
Monitor power graph
$ sudo turbostat --Summary --quiet --show PkgWatt --interval 1 | gawk '{ printf("%.2f\n" , $1); fflush(); }' | ttyplot -s 100 -t "Turbostat - CPU Power (watts)" -u "watts"
If you want to view all graphs together in 1 terminal screen then use the tmux program. Use the Ctrl-B + " and Ctrl-B + % option to create horizontal and vertical dividers to get 4 equal sized child terminals and then run one turbostat command in each of the child terminal.
2. s-tui - The Stress Terminal UI
The next tool is s-tui and it monitors all parameters including usage, temperature, frequency and power usage and plots multiple graphs in
In order to monitor the power consumption, it must be run with root privileges.
sudo s-tui
It will show summary and graph of various cpu parameters. Here is how it looks.
3. i7z - For Intel Core series cpus
There is a command line utility called i7z that works for intel core i3/i5/i7 cpus. It shows a bunch of info about the individual cpu cores including clock frequency, temperature and voltage. This can be useful for advanced level diagnostics or like when you are trying to overclock your cpu.
Install it with apt and run with sudo
$ sudo apt-get install i7z
sudo i7z
It would output information like this:
Cpu speed from cpuinfo 2999.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) 2999 MHz CPU Multiplier 30x || Bus clock frequency (BCLK) 99.97 MHz Socket [0] - [physical cores=4, logical cores=4, max online cores ever=4] TURBO ENABLED on 4 Cores, Hyper Threading OFF Max Frequency without considering Turbo 3098.97 MHz (99.97 x [31]) Max TURBO Multiplier (if Enabled) with 1/2/3/4 Cores is 35x/34x/34x/33x Real Current Frequency 3423.33 MHz [99.97 x 34.24] (Max of below) Core [core-id] :Actual Freq (Mult.) C0% Halt(C1)% C3 % C6 % Temp VCore Core 1 [0]: 3381.43 (33.83x) 7.23 68.7 1 22.1 57 1.1217 Core 2 [1]: 3423.33 (34.24x) 13.1 68.5 1 15.5 57 1.1118 Core 3 [2]: 3396.27 (33.97x) 9.47 56.7 1 31.6 58 1.1108 Core 4 [3]: 3371.24 (33.72x) 6.58 69.6 1 22 57 1.1036 C0 = Processor running without halting C1 = Processor running with halts (States >C0 are power saver modes with cores idling) C3 = Cores running with PLL turned off and core cache turned off C6, C7 = Everything in C3 + core state saved to last level cache, C7 is deeper than C6 Above values in table are in percentage over the last 1 sec [core-id] refers to core-id number in /proc/cpuinfo 'Garbage Values' message printed when garbage values are read Ctrl+C to exit
4. cpupower
The cpupower command from cpupowerutils also displays the frequency
watch -n1 sudo cpupower monitor
The output would look something like this
Every 1.0s: sudo cpupower monitor enlightened: Sat Nov 12 18:46:40 2022 | Nehalem || Mperf || Idle_Stats CPU| C3 | C6 | PC3 | PC6 || C0 | Cx | Freq || POLL | C1 | C1E | C3 | C6 | C7s | C8 0| 1.42| 33.62| 0.00| 0.00|| 5.99| 94.01| 3382|| 0.01| 1.83| 2.33| 2.06| 37.37| 0.00| 50.00 1| 0.26| 13.96| 0.00| 0.00|| 12.55| 87.45| 3407|| 0.00| 0.76| 0.90| 0.43| 15.50| 0.01| 69.21 2| 0.52| 23.60| 0.00| 0.00|| 9.58| 90.42| 3404|| 0.01| 3.18| 0.57| 0.80| 26.25| 0.00| 59.04 3| 1.53| 23.64| 0.00| 0.00|| 6.73| 93.27| 3374|| 0.03| 1.39| 0.88| 2.08| 26.57| 0.33| 61.50
There is a "Freq" column which shows the frequency in Mhz. This value is similar to the values shown by the i7z and /cpu/proc commands. For a detailed explanation of other columns check this article.
Discrepancy in the clock frequency
The clock frequency reported by turbostat Avg_Mhz metric is different from that reported by i7z and /proc/cpuinfo.
The values reported by i7z, /proc/cpuinfo, turbostat Bzy_Mhz are closer and similar.
Stressing the CPU
If you want to quickly load the cpu and see how the metrics change, use the stress command. Here is a quick and simple example
$ stress --cpu 8 --timeout 100s
The above command will create 8 threads that will run cpu-intensive tasks for 100 seconds continuously. Meanwhile you can monitor the metrics using the above shown methods.