zoukankan      html  css  js  c++  java
  • cpu_capacity、task_util、cpu_util计算方法

    在进程调度中使用到了一些比较关键的参数,用来作为调度、cpu调频、EAS等关键功能的前提。并且在相关模块中经常交替出现,比较容易混淆,这里单独将这些参数拎出来,做个记录。

    1.cpu_capacity

    cpu_capacity是作为cpu算力的量化体现,代表着cpu性能的大小。数字越大,性能越高。
    cpu的性能和cpu的运行频率是正相关的,频率越高,性能也越好。所以,在大cluster内cpu的max_capacity比小cluster内的cpu max_capacity更大。

    计算公式有2个,一个是cpu最大的capacity:cpu_max_capacity;另一个是当前freq下的cpu capacity。如下:

    static inline unsigned long capacity_of(int cpu) //cpu_capacity_orig基础上去掉rt、dl以及irq util后的capacity.
    {  //计算:(capacity_orig - rt_util - dl_util)*(capacity_orig - irq_util) / capacity_orig
        return cpu_rq(cpu)->cpu_capacity;
    }
    
    //获取当前policy_max_freq下的capacity(可能被thermal影响而缩小)
    static inline unsigned long capacity_orig_of(int cpu)  
    {
        return cpu_rq(cpu)->cpu_capacity_orig;
    }

    2. Task util

    task util是用来表示一个task大小,它会占用cpu多少算力,或者说是给cpu造成多少负载的体现。task util的监控是通过WALT得到,所以公式中一些参数也与WALT的配置有关。

    task util = demand *1024 / window_size //其中demand为WALT机制中sum_history数组得到的max(latest值,平均值),window_size则是WALT机制中window的大小(默认为20ms)
         = (delta / window_size) * (cur_freq / max_freq) * cpu_max_capacity ---delta是task在一个window中运行的真实时间;cur_freq为cpu当前频率;max_freq为cpu最大频率;

    特别地,打开了schedtune的boost之后,task util也会进行变化。公式如下:

    boosted task util = task_util +(1024 - task_util)* boost_percent //boost_percent是schedtune中配置的boost百分比

    获取task util代码:

    static inline unsigned long task_util(struct task_struct *p)
    {
    #ifdef CONFIG_SCHED_WALT
        return p->ravg.demand_scaled;
    #endif
        return READ_ONCE(p->se.avg.util_avg);
    }

    3. CPU util

    cpu util则表示当前有多少工作量在该cpu上,是cpu负载的体现。也是通过WALT机制监控得到:cumulative_runnable_avg_scaled。

    它是统计了当前一个WALT window中on_rq ==1的所有task util的总和

    cpu util = ∑ task_util(x) //表示所有on_rq的task util总和

         = ∑demand(x) * 1024 / window_size //∑demand(x) 表示cpu rq中所有runnable的task demand

    获取cpu_util的代码:

    static inline unsigned long cpu_util(int cpu)
    {
        struct cfs_rq *cfs_rq;
        unsigned int util;
    
    #ifdef CONFIG_SCHED_WALT
        u64 walt_cpu_util = cpu_rq(cpu)->walt_stats.cumulative_runnable_avg_scaled; //cpu负载
    
        return min_t(unsigned long, walt_cpu_util, capacity_orig_of(cpu));
    #endif
    
        cfs_rq = &cpu_rq(cpu)->cfs;
        util = READ_ONCE(cfs_rq->avg.util_avg);
    
        if (sched_feat(UTIL_EST))
            util = max(util, READ_ONCE(cfs_rq->avg.util_est.enqueued));
    
        return min_t(unsigned long, util, capacity_orig_of(cpu));
    }

    4. schedutil的调频的计算方法

             1.25 * cpuinfo.max_freq
    f = ———————————————————————————————— * boosted_util
                cpu_max_capacity
    
             1.25 * cpuinfo.max_freq
      = ———————————————————————————————— * [util + (1024 - util) * boost_percent],//boost_percent是schedtune配置的boost值
                cpu_max_capacity

    其中util计算公式如下:

                prev_runnable_sum * (100 + sched_load_boost)
    util = ———————————————————————————————————————————————————————, //prev_runnable_sum是WALT统计的值,window_size默认20ms
                        window_size >> 10 * 100

    boost_percent是schedtune配置的boost值,对应文件/sys/fs/cgroup/stune/performance/schedtune.boost.

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/13900104.html
Copyright © 2011-2022 走看看