Checking CPU clock speed in Linux helps explain why a system feels slow, whether busy cores are boosting as expected, and whether a host or virtual machine is capped below the processor's normal range. A live frequency table is often the quickest way to separate an idle power-saving state from an actual performance limit.

The lscpu command reads processor details from kernel interfaces such as /sys and /proc/cpuinfo and can print a per-CPU table with current, minimum, and maximum clock values. Calling the exact columns with –extended=cpu,mhz,minmhz,maxmhz avoids the default summary layout, which upstream notes can change between releases.

The command syntax and the unsupported-column behavior were rechecked on current Ubuntu 24.04 LTS ARM64 guests, where the frequency columns were returned as - because the environment was not exposing live CPUFreq data. On systems that do export those fields, the same table shows numeric MHZ, MINMHZ, and MAXMHZ values, so the decisive result is either a populated frequency table or a clear no-data indicator.

Steps to check CPU clock speed in Linux:

  1. Open a terminal on the target Linux system.
  2. Display the current, minimum, and maximum per-CPU clock values. On systems that expose live frequency data, the result looks like this.
    $ lscpu --extended=cpu,mhz,minmhz,maxmhz
    CPU       MHZ   MINMHZ    MAXMHZ
      0 3041.6411 400.0000 4829.0000
      1  400.0000 400.0000 4829.0000
      2 2898.4500 400.0000 4829.0000
      3  400.0000 400.0000 4829.0000
      4 2919.0759 400.0000 4829.0000
      5  400.0000 400.0000 4829.0000
      6 3069.2571 400.0000 4829.0000
      7  400.0000 400.0000 4829.0000
    ##### snipped #####

    MHZ is the current frequency reported for that logical CPU, while MINMHZ and MAXMHZ show the visible lower and upper range for the same processor. The exact values change as load, power policy, firmware limits, and boost behavior change.

  3. Re-run the same query when the system is idle and again while it is busy if the goal is to see whether active CPUs are rising above the minimum range.

    Large differences between idle and busy rows are normal. Many systems leave idle CPUs near the minimum value and raise only the cores that are handling work.

  4. Treat a - entry as unavailable data rather than a zero-MHz result.
    $ lscpu --extended=cpu,mhz,minmhz,maxmhz
    CPU MHZ MINMHZ MAXMHZ
      0   -      -      -
      1   -      -      -

    Upstream lscpu keeps requested columns in the table even when the current architecture, hypervisor, or kernel interfaces do not supply those values.

  5. Compare the current MHZ value with the visible MINMHZ and MAXMHZ range before deciding that the processor is stuck at the wrong speed.

    A real clock-speed problem is the consistent pattern: active CPUs that stay unexpectedly low under load, or a visible maximum that is lower than the processor should normally allow. A no-data table means the current environment is not exporting live frequency values, so move the same check to the physical host or another guest that exposes CPUFreq data.