,
lscpu查看信息
字节顺序:轻型结尾
CPU(s ) : 4
在线处理器(s )列表:0- 3
萨德(s ) per core: 1
酷睿(s ) Per套接字: 4
套接字(s ) : 1
numanode(s ) : 1
Model name:
CPU max MHz: 2000.0000
CPU min MHz: 225.0000
BogoMIPS: 199.68
L1d cache: 64K
L1i cache: 64K
L2 cache: 256K
L3 cache: 16384K
numanode0CPU(s ) : 0-3
上述数据的来源在哪里,用什么方法获取数据? 在strace中,我们看到了lscpu如何从内核中获取数据
已剪切足够的数据以表明lscpu的数据是从sys接口下获取的。
unmap (0x7ffff6ebc 000,65536 )=0
access (/sys/devices/system/CPU/CPU0/topology/book _ siblings ),F_OK )=-1enoent ) nosuchfileordirector
access (/sys/devices/system/CPU/CPU0/cache/index0',F_OK )=0
access (/sys/devices/system/CPU/CPU0/cache/index1',F_OK )=0
access (/sys/devices/system/CPU/CPU0/cache/index2',F_OK )=0
access (/sys/devices/system/CPU/CPU0/cache/index3',F_OK )=0
access ()/sys/devices/system/CPU/CPU0/cache/index4',F_OK )=-1enoent ) nosuchfileordirectory )。
access (/sys/devices/system/CPU/CPU0/cache/index0',F_OK )=0
open (/sys/devices/system/CPU/CPU0/cache/index0/type ',O_RDONLY|O_CLOEXEC )=3
这个接口下面有什么数据信息?
ls/sys /设备/系统/CPU /
CPU0/CPU3/热插头/modaliaspossibleuevent
CPU1/cpuautoplug/isolatedofflinepower /
CPU2/cpuidle/kernel _ max在线设置
根@-PC :/home/loong son # cat/sys/devices/system/CPU/CPU0/
cache/crash _ notes驱动程序/hot plug/power/topology /
cpufreq/crash _ notes _ size firmware _ node/node0/subsystem/uevent
root @-PC :/home/loong son # cat/sys/devices/system/CPU/CPU0/CPU freq /
affected _ CPU info _ transition _ latency scaling _ available _ governors scaling _ governor scaling _ set speed
CPU info _ max _ freq related _ CPU scaling _ cur _ freq scaling _ max _ freq
CPU info _ min _ freq scaling _ available _ frequencies scaling _ driver
scaling_min_freq设备节点下数据有很多,本次我们以cpu频率为例说明
CPU的硬件特性决定了这个CPU的最高和最低工作频率,所有的频率调整数值都必须在这个范围内,它们用cpuinfo_xxx_freq来表示。然后,我们可以在这个范围内再次定义出一个软件的调节范围,它们用scaling_xxx_freq来表示。
在内核中描述此频率使用的如下的结构体
一种调频策略的各种限制条件的组合称之为policy,代码中用cpufreq_policy这一数据结构来表示:
struct cpufreq_policy {
cpumask_var_t cpus;
cpumask_var_t related_cpus;
unsigned int shared_type;
unsigned int cpu;
unsigned int last_cpu;
struct cpufreq_cpuinfo cpuinfo;
unsigned int min; /* in kHz */
unsigned int max; /* in kHz */
unsigned int cur;
unsigned int policy;
struct cpufreq_governor *governor;
void *governor_data;
struct work_struct update;
struct cpufreq_real_policy user_policy;
struct kobject kobj;
struct completion kobj_unregister;
};
cpus和related_cpus 这两个都是cpumask_var_t变量,cpus表示的是这一policy控制之下的所有还出于online状态的cpu,而related_cpus则是online和offline两者的合集。主要是用于多个cpu使用同一种policy的情况,实际上,我们平常见到的大多数系统中都是这种情况:所有的cpu同时使用同一种policy。我们需要related_cpus变量指出这个policy所管理的所有cpu编号。
cpu和last_cpu 虽然一种policy可以同时用于多个cpu,但是通常一种policy只会由其中的一个cpu进行管理,cpu变量用于记录用于管理该policy的cpu编号,而last_cpu则是上一次管理该policy的cpu编号(因为管理policy的cpu可能会被plug out,这时候就要把管理工作迁移到另一个cpu上)。
cpuinfo 保存cpu硬件所能支持的最大和最小的频率以及切换延迟信息。
min/max/cur 该policy下的可使用的最小频率,最大频率和当前频率。
policy 该变量可以取以下两个值:CPUFREQ_POLICY_POWERSAVE和CPUFREQ_POLICY_PERFORMANCE,该变量只有当调频驱动支持setpolicy回调函数的时候有效,这时候由驱动根据policy变量的值来决定系统的工作频率或状态。如果调频驱动(cpufreq_driver)支持target回调,则频率由相应的governor来决定。
governor和governor_data 指向该policy当前使用的cpufreq_governor结构和它的上下文数据。governor是实现该policy的关键所在,调频策略的逻辑由governor实现。
update 有时在中断上下文中需要更新policy,需要利用该工作队列把实际的工作移到稍后的进程上下文中执行。
user_policy 有时候因为特殊的原因需要修改policy的参数,比如溫度过高时,最ssdmf允许的运行频率可能会被降低,为了在适当的时候恢复原有的运行参数,需要使用user_policy保存原始的参数(min,max,policy,governor)。
kobj 该policy在sysfs中对应的kobj的对象。
lscpu通过分析内核代码位置:drivers/cpufreq/,这里有ACPI模式和非ACPI模式,而通过下面接口可以查看当前使用的驱动类型
/sys/devices/system/cpu/cpuX/cpufreq/scaling_driver
另,
https://github.com/karelzak/util-linux/blob/master/sys-utils/lscpu.c 这是是lscpu的源码
通过lscpu代码我们可以看出lscpu采集信息量通过/sys/device/system