14.Linux lscpu命令详解

我们先看man lscpu

display information about the CPU architecture

翻译:显示cpu架构信息

具体的描述如下:

lscpu  gathers CPU architecture information from sysfs, /proc/cpuinfo
       and any applicable architecture-specific libraries (e.g.  librtas  on
       Powerpc).   The  command  output  can be optimized for parsing or for
       easy readability by humans.  The information includes,  for  example,
       the  number  of CPUs, threads, cores, sockets, and Non-Uniform Memory
       Access (NUMA) nodes.  There is also information about the CPU  caches
       and cache sharing, family, model, bogoMIPS, byte order, and stepping.

       In  virtualized  environments,  the CPU architecture information dis‐
       played reflects the configuration of the guest operating system which
       is typically different from the physical (host) system.  On architec‐
       tures that support retrieving physical  topology  information,  lscpu
       also  displays  the  number  of physical sockets, chips, cores in the
       host system.

       Options that result in an output table have  a  list  argument.   Use
       this argument to customize the command output.  Specify a comma-sepa‐
       rated list of column labels to limit the output  table  to  only  the
       specified  columns, arranged in the specified order.  See COLUMNS for
       a list of valid column labels.  The column labels are not case sensi‐
       tive.

       Not  all  columns  are  supported on all architectures.  If an unsup‐
       ported column is specified, lscpu prints the column but does not pro‐
       vide any data for it.

翻译如下:
lscpu命令从sysfs、/proc/cpuinfo、或者某些适用于特定架构的库中收集数据。命令的输出会以人类易读的方式展示如下信息:cpu、线程、核心、插槽和Non-Uniform MemoryAccess (NUMA)节点的数量,也有cpu共享缓存,cpu的族号,运行模式,处理指令的速度,大小端,步进等信息

在虚拟环境下,系统架构信息展示映射着客户操作系统的设置,这和物理主机是有明显差异的。在架构上支持检索物理拓扑信息,lscpu命令也显示主机系统中的物理插槽数量,芯片,内核数。

Options可以提供一些参数,用这些参数可以自定义命令输出。指定一个列表分隔符,指定一个逗号分隔的列标签列表,以将输出表限制为按指定的顺序排列的指定的列。按指定顺序排列。 有效列标签请参考COLUMNS的列表。列标签不区分大小写。(man的输出中有各种参数太多这里就不放出来了。可以自己去查看)

我们再来看一下命令执行结果

Architecture:          x86_64 //架构--这里的64指的位处理器
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian //小端法
CPU(s):                4    //cpu数量
On-line CPU(s) list:   0-3  //在线的cpu数量 有些时候为了省电或者过热的时候,某些CPU会停止运行
Thread(s) per core:    1    //每个核心的线程数
Core(s) per socket:    4    //每个插槽上有几个核心
座:                 1      
NUMA 节点:         1       //NUMA 这个太复杂,所以他的解释在下面
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              94
型号名称:        Intel(R) Xeon(R) CPU E3-1225 v5 @ 3.30GHz
步进:              3 //这个可以简单理解为版本号  也有A0这样的标识方式
CPU MHz:             900.023
CPU max MHz:           3700.0000
CPU min MHz:           800.0000
BogoMIPS:            6624.00 // MIPS是每秒百万条指令,Bogo是Bogus(伪)的意思,这里是估算MIPS值
虚拟化:           VT-x //虚拟化技术,这个我不太懂,不敢乱说
L1d 缓存:          32K //一级高速缓存 dcache 用来存储数据
L1i 缓存:          32K //一级高速缓存 icache 用来存储指令  
L2 缓存:           256K
L3 缓存:           8192K //缓存速度上 L1 > L2 > L3 > DDR(内存) 内存的理论速度在几十g一秒
NUMA 节点0 CPU:    0-3 //四个cpu在一个numa节点上
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb invpcid_single intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 dtherm arat pln pts hwp hwp_notify hwp_act_window hwp_epp

//Flags是标识了一些cpu的特征  具体可以查看https://blog.csdn.net/nemo2011/article/details/7531212

man中还有更多的描述,对大家来说意义也不大,接下来我们直接看选项了

    选项:
 -a, --all               同时打印在线和离线 CPU (-e 选项默认值)  此选项只能与选项-e 或-p 一起指定
 -b, --online            只打印在线 CPU (-p 选项默认值) 此选项只能与选项-e 或-p 一起指定
 -c, --offline           只打印离线 CPU   此选项只能与选项-e 或-p 一起指定。
 -e, --extended[=<列表>] 打印扩展的可读格式  (类似表格的形式)
                如果省略该列表参数, 则在命令输出中包括所有可用数据的列
                指定列表参数时, 选项字符串、等号 (=) 和列表不能包含任何空格或其他空白。 
                结果如下:
                CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
                0   0    0      0    0:0:0:03700.0000 800.0000
                1   0    0      1    1:1:1:03700.0000 800.0000
                2   0    0      2    2:2:2:03700.0000 800.0000
                3   0    0      3    3:3:3:03700.0000 800.0000
                带list示例: lscpu -e=cpu,node
 -p, --parse[=<列表>]    打印可解析格式
                如果省略该列表参数, 则命令输出与早期版本的 lscpu 兼容。 
                在此兼容格式中, 两个逗号用于分隔 CPU 缓存列。 
                如果未标识任何 CPU 缓存, 则忽略缓存列。
                如果使用列表参数, 则缓存列将用冒号 (:) 分隔
                示例: lscpu -p=cpu,node,,L1d:L1i
                我在使用上面命令的时候,不带缓存列正常显示,带缓存列不能输出数据也没报错,迷茫
 -s, --sysroot <目录>    以指定目录作为系统根目录
                收集 lscpu 命令所发出的实例以外的 Linux 实例的 CPU 数据。
                指定的目录是要检查的 Linux 实例的系统根。
 -x, --hex               打印十六进制掩码而非 CPU 列表
 -y, --physical          print physical instead of logical IDs 
                显示所有列的物理 id。 除了由 lscpu 分配的逻辑 id 之外
                物理 id 是由内核提供的特定于平台的值。无法检索元素的物理 ID 用破折号 (-) 字符显示
                此选项不影响 CPU 逻辑编号。

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出


可用的列:
           CPU  逻辑 CPU 数量
          CORE  逻辑核心数量
        SOCKET  逻辑(CPU)座数量
          NODE  逻辑 NUMA 节点数量
          BOOK  逻辑 book 数
        DRAWER  logical drawer number   //逻辑抽屉数(不太明白,好像和book有关系)
         CACHE  shows how caches are shared between CPUs    //cpu之间如何共享缓存
  POLARIZATION  CPU dispatching mode on virtual hardware    //虚拟硬件上的CPU调度模式
       ADDRESS  physical address of a CPU //cpu物理地址
    CONFIGURED  shows if the hypervisor has allocated the CPU //管理程序是否分配了cpu
        ONLINE  shows if Linux currently makes use of the CPU //在使用的cpu
        MAXMHZ  shows the maximum MHz of the CPU    //最大频率
        MINMHZ  shows the minimum MHz of the CPU    //最小频率

一、lscpu输出

使用lscpu查看的结果如下图,这里会显示很多信息,如下:

 使用lscpu -p会详细的numa信息,如下:

[root@localhost ~]# lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,1,2,,1,1,1,1
2,2,2,4,,2,2,2,2
3,3,3,7,,3,3,3,3
4,0,0,0,,4,0,0,0
5,1,1,2,,5,1,1,1
6,2,2,4,,6,2,2,2
7,3,3,7,,7,3,3,3
8,4,0,0,,8,4,4,0
9,5,1,2,,9,5,5,4
…………略部

 描述:

此命令用来显示cpu的相关信息
  lscpu从sysfs和/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读
  命令输出的信息包含cpu数量,线程,核数,套接字和Nom-Uniform Memeor Access(NUMA),缓存等
  不是所有的列都支持所有的架构,如果指定了不支持的列,那么lscpu将打印列,但不显示数据

语法:

lscpu [-a|-b|-c] [-x] [-s directory] [-e [=list]|-p [=list]]
  lscpu -h|-V

参数选项:

-a, –all: 包含上线和下线的cpu的数量,此选项只能与选项e或-p一起指定
-b, –online: 只显示出上线的cpu数量,此选项只能与选项e或者-p一起指定
-c, –offline: 只显示出离线的cpu数量,此选项只能与选项e或者-p一起指定
-e, –extended [=list]: 以人性化的格式显示cpu信息,如果list参数省略,输出所有可用数据的列,在指定了list参数时,选项的字符串、等号(=)和列表必须不包含任何空格或其他空白。比如:’-e=cpu,node’ or ’–extended=cpu,node’
-h, –help:帮助
-p, –parse [=list]: 优化命令输出,便于分析.如果省略list,则命令的输出与早期版本的lscpu兼容,兼容格式以两个逗号用于分隔cpu缓存列,如果没有发现cpu缓存,则省略缓存列,如果使用list参数,则缓存列以冒号(:)分隔。在指定了list参数时,选项的字符串、等号(=)和列表必须不包含空格或者其它空白。比如:’-e=cpu,node’ or ’–extended=cpu,node’
-s, –sysroot directory: 为一个Linux实例收集CPU数据,而不是发出lscpu命令的实例。指定的目录是要检查Linux实例的系统根
-x, –hex:使用十六进制来表示cpu集合,默认情况是打印列表格式的集合(例如:01) 

显示格式:

Architecture:         #架构
  CPU(s):                 #逻辑cpu颗数
  Thread(s) per core:     #每个核心线程
  Core(s) per socket:     #每个cpu插槽核数/每颗物理cpu核数
  CPU socket(s):          #cpu插槽数
  Vendor ID:              #cpu厂商ID
  CPU family:             #cpu系列
  Model:                  #型号
  Stepping:               #步进
  CPU MHz:                #cpu主频
  Virtualization:         #cpu支持的虚拟化技术
  L1d cache:              #一级缓存(google了下,这具体表示表示cpu的L1数据缓存)
  L1i cache:              #一级缓存(具体为L1指令缓存)
  L2 cache:               #二级缓存

以下几个概念

  * processor 条目包括这一逻辑处理器的唯一标识符。    * physical id 条目包括每个物理封装的唯一标识符。    * core id 条目保存每个内核的唯一标识符。    * siblings 条目列出了位于相同物理封装中的逻辑处理器的数量。    * cpu cores 条目包含位于相同物理封装中的内核数量。    * 如果处理器为英特尔处理器,则 vendor id 条目中的字符串是 GenuineIntel。
 
socket:物理CPU的插槽
Core per Socket:每一个插槽对应的物理CPU上有多少个核
Thread per Core:每个核上有多少个线程
看个图:(几核几线程就是指有多少个“Core per Socket”多少个“Thread per Core”,当后者比前者多时,
说明启用了超线程技术)

命令执行结果:

i2000:~ # lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             4
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Stepping:              4
CPU MHz:               2499.998
BogoMIPS:              4999.99
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7

socket就是主板上插cpu的槽的数目,也就是可以插入的物理CPU的个数。

core就是我们平时说的“核“,每个物理CPU可以双核,四核等等。

thread就是每个core的硬件线程数,即超线程

输入命令cat /proc/cpuinfo 查看physical id有几个,上述结果显示只有0,所以只有一个物理cpu;查看processor有几个,上述结果显示有0和1两个,所以有两个逻辑cpu。

(一)概念
① 物理CPU
实际Server中插槽上的CPU个数
物理cpu数量,可以数不重复的 physical id 有几个
② 逻辑CPU
/proc/cpuinfo 用来存储cpu硬件信息的
信息内容分别列出了processor 0 –processor n 的规格。这里需要注意,n是逻辑cpu数
一般情况,我们认为一颗cpu可以有多核,加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的cpu core出来
逻辑CPU数量=物理cpu数量 x cpu cores 这个规格值 x 2(如果支持并开启ht)
备注一下:Linux下top查看的CPU也是逻辑CPU个数
③ CPU核数
一块CPU上面能处理数据的芯片组的数量、比如现在的i5 760,是双核心四线程的CPU、而 i5 2250 是四核心四线程的CPU
一般来说,物理CPU个数×每颗核数就应该等于逻辑CPU的个数,如果不相等的话,则表示服务器的CPU支持超线程技术
㈡ 查看CPU信息
当我们 cat /proc/cpuinfo 时、
具有相同core id的CPU是同一个core的超线程
具有相同physical id的CPU是同一个CPU封装的线程或核心
㈢ 下面举例说明
① 查看物理CPU的个数

#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
2 


② 查看逻辑CPU的个数

#cat /proc/cpuinfo |grep "processor"|wc -l
24 


③ 查看CPU是几核

#cat /proc/cpuinfo |grep "cores"|uniq
6 


我这里应该是2个Cpu,每个Cpu有6个core,应该是Intel的U,支持超线程,所以显示24

scpu 显示 CPU 的架构信息

lscpusysfsproc/cpuinfo 中收集信息。这个命令的输出是规范的可以用来解析,或者给人来阅读。该命令显示的信息包括,CPU 的数量,线程 (thread),核心 (core),Socket 还有 Non-Uniform Memory Access (NUMA) 节点数。

    Socket 具体是指的主板上 CPU 的插槽数量,一般笔记本只有一个,而服务器可能会有多个。如果有两个插槽,通常称为两路
    Core 具体是指 CPU 的核心,也就是平常说的几核,比如八核之类
    thread 是指的每个 Core 的硬件线程数,超线程

举例来说,如果某个服务器”2 路 4 核超线程”,也就是 2 个插槽,4 核心,默认为 2 thread,也就是 242 是 16 逻辑 CPU。对操作系统来说,逻辑 CPU 的数量就是 Socket * Core * Thread。

比如下面我的台式机,1 Sockets, 4 Cores,2 Threads,那么就是 4 核 8 线程。

如下示例:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1

CPU 文件存放在 /sys/devices/system/cpu/

将指定的CPU关闭

cd /sys/devices/system/cpu/   # 进入CPU目录
 
pwd
/sys/devices/system/cpu
 
ls -Al |grep 'cpu[0-9]'    # 正规则查询 CPU目录下 所有CPU
drwxr-xr-x. 6 root root    0 2月   5 2018 cpu0
drwxr-xr-x. 6 root root    0 2月   5 2018 cpu1
 
cat ./cpu[0-9]/online    # 查看所有CPU的 online 值
1
1
 
echo 0 > ./cpu1/online   # 将CPU0 关闭
 
cat ./cpu[0-9]/online    
1
0
lscpu |grep -Ei  'on-line|off-line'  # 查看所有CPU的 online 值,可以看到 CPU1 已经被关闭
On-line CPU(s) list:   1
Off-line CPU(s) list:  0

参考:https://www.cnblogs.com/machangwei-8/p/10398902.html

https://www.cnblogs.com/vinter/p/9712404.html

原文地址:https://www.cnblogs.com/zhongguiyao/p/13940318.html