As a Linux administrator, having deep visibility into your server CPU architecture via lscpu
is critical for everything from security analysis to capacity planning and performance tuning. In this advanced guide, we will dissect lscpu
usage for Linux CPU reporting and discuss ways to leverage the output for critical sysadmin tasks.
CPU Architecture Basics
Before diving into lscpu
, let‘s briefly cover some key CPU architecture concepts related to output that lscpu
reports on:
Microarchitecture: The microarchitecture is the internal functional design of the processor. For example, Intel Sandy Bridge, Ivy Bridge, Skylake etc. Each evolution brings advancements in performance, efficiency and features.
Sockets: A CPU socket refers to the physical interface that provides connectivity for a processor to pins on the computer motherboard. Multi-socket capable boards allow installing multiple CPUs.
Cores: Physical processing units that read and execute CPU instructions. Modern CPUs typically have multiple cores to allow parallelized execution of threads.
Threads: Logical CPUs that are mapped onto physical cores. HyperThreading (HT) provides two threads per core for improved utilization.
Caches: Extremely fast internal memory pools on the CPU to avoid slow external memory access. Includes multiple levels (L1, L2, L3) with the lowest latency.
NUMA Nodes: A Non-Uniform Memory Access (NUMA) node locally groups CPU cores with memory controllers/DIMM banks for reduced latency. Remote NUMA node access incurs a penalty.
CPU Flags: The feature flags denote what instruction set extensions the CPU microarchitecture supports for security, virtualization, cryptography and more.
Understanding these structural details is key to leveraging lscpu
output for analyses. Now let‘s explore lscpu
itself..
Introducing the lscpu Command
The lscpu
utility provides a succinct snapshot of the server‘s CPU architecture, configuration and capabilities. It sources its raw data from Linux‘s /proc/cpuinfo
pseudo-filesystem, but translates the verbose detail into human-friendly output.
Some examples of info lscpu
reports:
- Number of CPU sockets, cores, threads
- NUMA topology and node CPU assignments
- L1, L2, L3 cache sizes
- Microarchitecture name and model
- Min/Max clock speeds
- Instruction set architecture (x86_64, ARM etc.)
- Feature flags to determine extensions supported
In addition to the default output, over a dozen command line options are available for filtering, formatting and customizing lscpu
reports.
Next we will explore usage patterns both for one-off inspection and retention for historical comparison.
Leveraging /proc/cpuinfo
The foundation of lscpu
output is gathered from Linux‘s /proc
pseudo-filesystem, specifically /proc/cpuinfo
. This dynamically generated file exposes extensive raw details on the system‘s CPU configuration via 60+ info fields.
Here is a small snippet of /proc/cpuinfo
contents:
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model name : Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz
stepping : 2
cpu MHz : 3501.998
cache size : 10240 KB
physical id : 0
siblings : 12
core id : 0
cpu cores : 6
apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
While everything required is present, mining the raw data on large systems with 100+ cores can prove burdensome. This is where lscpu
shines by parsing and massaging the data into human consumable bits.
For instance, here is sample output from the exact same system:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 12
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Stepping: 2
CPU max MHz: 3501.0000
CPU min MHz: 1200.0000
BogoMIPS: 6983.37
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 15360K
Much easier to ingest key details with lscpu
! But power users can still intersect with /proc/cpuinfo
for custom reporting needs with all the raw data.
Now let‘s move on to some popular usage examples…
Comparing lscpu Output Over Time
One common tactic is retaining lscpu
snapshots at various points, such as when new servers get built, to track changes over time.
For example, when refreshing hardware, we can confirm specs of the new gear by comparing lscpu
output against the old setup.
# Old Server
Architecture: x86_64
CPU(s): 24
Model: Intel Xeon E5-2690 v3
L3 cache: 30720K
Flags: fpu vme de [..snip..]
# New Server
Architecture: x86_64
CPU(s): 128
Model: Intel Xeon Gold 6258R
L3 cache: 35840K
Flags: fpu vme de pse [..snip..] abm 3dnowprefetch
We can instantly validate key attributes like higher core count, updated CPU model names, enlarged L3 cache and addition of the crucial abm 3dnowprefetch
flag. Nice!
This method can also be used after BIOS tweaks to ensure cores weren‘t accidentally disabled etc. Having a revision history via lscpu
can prove quite valuable.
Sysadmin Problem Determination
In client server troubleshooting scenarios, lscpu
is enormously helpful for gathering key CPU details that could point to root causes.
Some examples of rapid diagnosis with lscpu
:
Disabled Cores Detection:
$ lscpu
CPU(s): 96
On-line CPU(s) list: 0-47,56-95
<!! Cores 48-55 currently offline !!>
Hyperthreading Comparison:
# Server 1
Thread(s) per core: 2
# Server 2
Thread(s) per core: 1
<!! HT is disabled on Server 2 !!>
NUMA Imbalance Discovery:
NUMA node0: 72 CPUs
NUMA node1: 24 CPUs
<!! Strong imbalance between NUMA nodes !!>
Max Turbo Verification:
CPU max MHz: 3600.0000
<!! Matches expected Intel Turbo Boost freq !!>
And many more similar issues can be identified with some basic lscpu
interrogation.
Next up, let‘s discuss some more advanced use cases…
Automated Capacity Planning
In cloud and containerized environments, lscpu
stats can drive automated scaling decisions in container orchestrators and auto-scalers.
For example, Kubernetes Horizontal Pod Autoscalers (HPA) scale pod replica counts based on metrics like CPU. By gathering key data like physical cores and overprovisioning ratios, we can configure proper thresholds and safety buffers.
Here is an example bash function to calculate safe scaling limits based on lscpu
topology info:
function get_capacity() {
sockets=$(lscpu | grep "Socket(s)" | awk ‘{print $2}‘)
cores=$(lscpu | grep "Core(s) per socket" | awk ‘{print $4}‘)
threads=$(lscpu | grep "Thread(s) per core" | awk ‘{print $4}‘)
total_cores=$((sockets * cores))
hyperthreads=$((total_cores * threads))
echo "Total Usable CPU Cores: $total_cores"
echo "Total Hyperthreads: $hyperthreads"
# Safe scaling threshold
safe_threshold=80
limit=$((total_cores * safe_threshold / 100))
# Print limits
echo "Recommended Max CPU Limit: $limit"
}
get_capacity
Feeding metrics like the safe CPU limit into autoscalers allows optimally sizing clusters for capacity without overprovisioning.
Analyzing Performance Regressions
When optimizing systems, lscpu
provides vital clues into possible performance cliffs between microarchitecture generations.
As an example, Ivy Bridge processors introduced a superior Level 4 decoding cache. Comparing against older Sandy Bridge reveals:
# Sandy Bridge
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
# Ivy Bridge
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 25600K
L4 cache: 128K <!!
The addition of the L4 decode cache can translate to big boosts for certain workloads.
Likewise we can identify introduction of key tech like AVX-512 support:
# Old CPU
Flags: fpu vme de [..snip..]
# New CPU
Flags: fpu vme de [..snip..] avx512f avx512cd avx512dq pdpe1gb rdseed adx smap [..]
By comparing flags for crucial advances, you can better understand generational leaps in capabilities that impact behavior.
Getting Detailed CPU Pinning
Applications that benefit from CPU pinning can use lscpu
to gather detailed pinned core assignments instead of just IDs.
Here is an example isolcpu kernel parameter:
isolcpus=2,4-7,15-19,21-23
We can decode the actual physical placement with:
$ lscpu -p=Core,CPU | grep -F ‘ yes‘ | grep -oP ‘Core \K.*?(?=,)‘
0
1
0
1
2
3
0
1
2
3
0
1
Now performance sensitive processes can be pinned to targeted cores/sockets for optimal locality and isolation.
Comparison to Other Tools
While lscpu
provides the best all-around CPU reporting, other niche tools can supplement for corner cases. Specifically:
- dmidecode for BIOS level details and settings
- lstopo for visual topology mapping
- likwid-topology for cache sharing diagrams
- turbostat for fine-grained frequency/power inspection
Integrating context from these tools can assemble an even broader profile of system characteristics. But lscpu
undoubtedly remains the crown jewel for balanced Linux processor stats.
Final Words
I hope this advanced guide has shed light into the immense power of lscpu
for administering Linux environments. From architecture specifics to capacity management and beyond – let lscpu
be part of your trusty toolbox.
Please feel free to ping me on the Linux Admins Slack (@daniel) with any further questions or use cases I may have missed!