lscpu 从内核获取数据分析

lscpu查看信息

Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           1
NUMA node(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
NUMA node0 CPU(s):   0-3

上述数据的来源是哪里,通过何种方式获取数据?我们通过strace看到lscpu是如何从内核获取到数据

我们截取了一段数据足以说明lscpu的数据是从sys接口下获取到的。

unmap(0x7ffff6ebc000, 65536)           = 0
access("/sys/devices/system/cpu/cpu0/topology/book_siblings", F_OK) = -1 ENOENT (No such file or directory)
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) = -1 ENOENT (No such file or directory)
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/devices/system/cpu/
cpu0/        cpu3/        hotplug/     modalias     possible     uevent
cpu1/        cpuautoplug/ isolated     offline      power/       
cpu2/        cpuidle/     kernel_max   online       present      
 

root@-pc:/home/loongson# cat /sys/devices/system/cpu/cpu0/
cache/            crash_notes       driver/           hotplug/          power/            topology/         
cpufreq/          crash_notes_size  firmware_node/    node0/            subsystem/        uevent            
root@-pc:/home/loongson# cat /sys/devices/system/cpu/cpu0/cpufreq/
affected_cpus                  cpuinfo_transition_latency     scaling_available_governors    scaling_governor               scaling_setspeed
cpuinfo_max_freq               related_cpus                   scaling_cur_freq               scaling_max_freq               
cpuinfo_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的参数,比如溫度过高时,最大可允许的运行频率可能会被降低,为了在适当的时候恢复原有的运行参数,需要使用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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值