HaiPeng(lzuzhp@gmail.com)

一.Linux内核cpu利用率的统计

查找目前linux内核广泛使用的工具top、vmstat源代码可以,cpu利用率是通过读/proc/stat数据,加以修饰得到的。top、vmstat软件统计的cpu利用率是基于时钟中断的,当时钟中断发生的时候,account_user_time、account_system_time、account_idle_time等相关统计函数函数,会将该进程的utime、stime(数据在进程的task_struct结构体中)添加到每个cpu拥有的结构体struct cpu_usage_stat中。

cpufreq使用get_cpu_idle_time与get_cpu_iowait_time函数用来统计cpu的idle时间与iowait时间,当cpu进入tickless状态的时候(CONFIG_NO_HZ=y),get_cpu_idle_time会调用get_cpu_idle_time_us来统计此状态下的idle时间,否则调用get_cpu_idle_time_jiffy从struct cpu_usage_stat获得相关idle时间。也就是cpufreq对cpu利用率的统计比top、vmstat工具多考虑了tickless这种状态。

二.Tickless导致的bug

1.      修改dricers/cpufreq/cpufreq_ondemand.c中的dbs_check_cpu函数,在486行添加打印cpu负载信息的语句:

485                 load = 100 * (wall_time - idle_time) / wall_time;
486                 printk("cpu %d load %d\n",j,load);

2.     重新编译内核,并将相关文件烧写到pandaboard中的sd卡中,重启系统,待系统进入idle状态后,printk输出的cpu负载信息是:

[ 2343.020874] cpu 0 load 70
[ 2343.024353] cpu 1 load 2
[ 2344.023040] cpu 0 load 68
[ 2344.026245] cpu 1 load 1
[ 2345.014465] cpu 0 load 68
[ 2345.017974] cpu 1 load 7
[ 2346.095092] cpu 0 load 77
[ 2346.095092] cpu 1 load 2
[ 2347.013793] cpu 0 load 68
[ 2347.017028] cpu 1 load 3
[ 2348.017242] cpu 0 load 59
[ 2348.020629] cpu 1 load 14
[ 2349.020202] cpu 0 load 67
[ 2349.023437] cpu 1 load 5
[ 2350.015808] cpu 0 load 82
[ 2350.019012] cpu 1 load 2
[ 2351.062286] cpu 0 load 65
[ 2351.065490] cpu 1 load 3
[ 2352.007965] cpu 0 load 68
[ 2352.011444] cpu 1 load 2
[ 2353.015167] cpu 0 load 51
[ 2353.018524] cpu 1 load 10
[ 2354.021636] cpu 0 load 69
[ 2354.025146] cpu 1 load 2
[ 2355.023162] cpu 0 load 72
[ 2355.026367] cpu 1 load 3
[ 2356.009704] cpu 0 load 63
[ 2356.012939] cpu 1 load 4
[ 2357.007904] cpu 0 load 68
[ 2357.007965] cpu 1 load 2
[ 2358.014495] cpu 0 load 66

vmstat输出的结果是:

procs  memory                       system          cpu
r  b    free mapped   anon   slab    in   cs  flt  us ni sy id wa ir
0  0  399960 122640 110720  10708   188   32    0   0  0  0 99  0  0
0  0  399960 122640 110720  10708   298  223    0  11  0  2 99  0  0
0  0  399960 122640 110740  10708   195   32    0   0  0  1 99  0  0
0  0  399960 122640 110748  10708   186   29    0   0  0  0 99  0  0
0  0  399960 122640 110748  10708   191   28    0   0  0  0 99  0  0
0  0  399960 122640 110748  10708   189   31    0   0  0  0 99  0  0
0  0  399960 122640 110748  10708   231   34    0   0  0  4 99  0  0
0  0  399960 122640 110748  10708   201   29    0   0  0  1 99  0  0
0  0  399960 122640 110748  10708   181   32    0   0  0  0 99  0  0
0  0  399960 122640 110748  10704   188   21    0   0  0  0 99  0  0
0  0  399960 122640 110748  10704   193   35    0   0  0  1 99  0  0
1  0  399960 122640 110748  10704   206   28    0   0  0  1 99  0  0

关掉cpu1后,printk打印的cpu0的负载是:

[ 2720.071258] cpu 0 load 71
[ 2721.148071] cpu 0 load 76
[ 2722.187713] cpu 0 load 76
[ 2723.251342] cpu 0 load 70
[ 2724.336151] cpu 0 load 81
[ 2725.351806] cpu 0 load 75
[ 2726.379638] cpu 0 load 74
[ 2727.469604] cpu 0 load 75
[ 2728.500091] cpu 0 load 71
[ 2729.569946] cpu 0 load 72
[ 2730.577789] cpu 0 load 79
[ 2731.664886] cpu 0 load 80
[ 2732.836181] cpu 0 load 75
[ 2733.866851] cpu 0 load 76
[ 2734.946563] cpu 0 load 80
[ 2735.965270] cpu 0 load 80
[ 2736.968200] cpu 0 load 68
[ 2737.968200] cpu 0 load 79
[ 2738.973175] cpu 0 load 72
[ 2739.983154] cpu 0 load 83
[ 2741.062103] cpu 0 load 71
[ 2742.109619] cpu 0 load 73
[ 2743.189453] cpu 0 load 73
[ 2744.226165] cpu 0 load 83
[ 2745.281463] cpu 0 load 68
[ 2746.324768] cpu 0 load 75
[ 2747.384948] cpu 0 load 77
[ 2748.405853] cpu 0 load 80

Vmstat显示的cpu0的负载是:

procs  memory                       system          cpu
r  b    free mapped   anon   slab    in   cs  flt  us ni sy id wa ir
0  0  400608 122636 110676  10708   167   19    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   203   64    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   170   31    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   183   35    0   0  0  0 98  0  0
0  0  400608 122640 110676  10708   174   26    0   1  0  0 99  0  0
0  0  400608 122640 110676  10708   179   31    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   175   28    0   0  0  0 98  0  0
0  0  400608 122640 110676  10708   173   26    0   0  0  1 98  0  0
0  0  400608 122640 110676  10708   163   25    0   0  0  1 99  0  0
0  0  400608 122640 110676  10708   173   24    0   0  0  1 99  0  0
0  0  400608 122640 110676  10708   173   29    0   0  0  0 99  0  0
1  0  400608 122640 110676  10708   179   25    0   0  0  1 99  0  0
1  0  400608 122640 110676  10708   172   22    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   177   32    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   173   29    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   173   28    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   169   27    0   0  0  2 99  0  0
0  0  400608 122640 110676  10708   175   33    0   0  0  1 99  0  0
0  0  400608 122640 110676  10708   169   19    0   0  0  0 99  0  0
0  0  400608 122640 110676  10708   177   23    0   0  0  0 99  0  0

3.      在x86平台上两者是相同的,cpufreq调频工具的ondemand策略会调用dbs_check_cpu来检查cpu的负载情况(printk打印的load就是),根据负载来调整cpu的主频,由于dbs_check_cpu显示的cpu负载跟vmstat显示的cpu负载差别很大,而且两者对cpu利用率的计算仅仅差别在tickless,因此将pandaboard上采用的linux内核中的tickless关掉(CONFIG_NO_HZ=N),重新进行上述实验,发现问题解决!

4.    pandaboard上运行的内核是 android-omap-panda- 3.0 ,获得方法:
git clone https://android.googlesource.com/kernel/omap.git
cd omap
git checkout origin/android-omap-panda-3.0

omap-pand-3.0 tickless bug及解决方案相关推荐

  1. [Z]为Web程序员解毒:9个IE常见Bug的解决方案

    编辑点评:Web程序员及设计师往往为了其CSS在IE下表现怪异而痛苦不已,而IE则因此被公认为Web程序员的毒药.本文总结了9个IE上最常见的Bug,以及它们的解决方案. 本文来自酷壳coolshel ...

  2. 为Web程序员解毒:9个IE常见Bug的解决方案

    为Web程序员解毒:9个IE常见Bug的解决方案 http://developer.51cto.com  2009-11-18 09:42  耗子  酷壳  我要评论(0) Web程序员及设计师往往为 ...

  3. 移动开发中一些bug及解决方案

    网页开发要面对各种各样的浏览器,让人很头疼,而移动开发中,你不但要面对浏览器,还要面对各种版本的手机,ios好一点,而安卓就五花八门了,你可能在开发中也被它们折磨过,或者正在被它们折磨,我在这里说几个 ...

  4. 创建或打开解决方案时提示“DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86“错误的解决方案

    创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案 参考文章: (1)创建或打开解决方案时提示& ...

  5. Navicat连接MySQL8.0出现乱码的解决方案

    Navicat连接MySQL8.0出现乱码的解决方案 参考文章: (1)Navicat连接MySQL8.0出现乱码的解决方案 (2)https://www.cnblogs.com/ray-mr-hua ...

  6. 关于Unsupported major.minor version 52.0报错问题解决方案

    关于Unsupported major.minor version 52.0报错问题解决方案 参考文章: (1)关于Unsupported major.minor version 52.0报错问题解决 ...

  7. error: Microsoft Visual C++ 14.0 is required问题解决方案

    error: Microsoft Visual C++ 14.0 is required问题解决方案汇总 用pip或者conda安装一些库函数的时候提示错误:error: Microsoft Visu ...

  8. 使用app-inspector时报错connect ECONNREFUSED 127.0.0.1:8001的解决方案

    使用app-inspector时报错connect ECONNREFUSED 127.0.0.1:8001的解决方案 参考文章: (1)使用app-inspector时报错connect ECONNR ...

  9. Vue2.0用户权限控制解决方案

    Vue2.0用户权限控制解决方案 参考文章: (1)Vue2.0用户权限控制解决方案 (2)https://www.cnblogs.com/zhumengke/articles/11526973.ht ...

最新文章

  1. @AUTORELEASEPOOL
  2. Win64 驱动内核编程-6.内核里操作注册表
  3. 移动端网页fixed布局问题解决方案
  4. php7 根据日期算星座,php根据日期判断星座的函数分享
  5. 常用数据库连接串与驱动总结
  6. jQuery 1.2 带来的兼容问题及对策
  7. Java中的Type接口和Class类有什么区别
  8. 【Oracle】重命名数据文件
  9. 什么叫pin脚的pad_普思海鸥脚H1102NL百兆网络变压器
  10. Atitit.在线充值功能的设计
  11. CMU 15-213 Introduction to Computer Systems学习笔记(10) The Memory Hierarchy
  12. SQL连接两张或多张表
  13. python遍历json_python3如何遍历json数据
  14. 百度网盘推出领取七天会员
  15. Ubuntu文件系统损坏修复
  16. 澳大利亚域名_澳大利亚域名.au注册要求
  17. 前端单行省略号和多行省略号
  18. Luogu P1530 分数化小数 Fractions to Decimals(模拟)
  19. 行癫:只有合作伙伴和客户成功,才是阿里云的成功
  20. 基于FPGA的数字交通红绿灯Verilog开发Modelsim仿真

热门文章

  1. mysql percona yum_yum 安装percona mysql 5.7
  2. flex布局中,保持内容不超出容器的解决办法
  3. Unity Toggle组制作菜单及菜单栏移动和二级菜单实现!
  4. android 手机获取 root 权限
  5. 解决windows系统下8080端口被占用
  6. 测试android sdk是否安装成功,配置Android SDK
  7. 薪资25k,我从字节跳动离职了...
  8. c# RestSharp 发送 x-www-form-urlundecoded 请求
  9. java数组转字符串 字符串转数组
  10. android动画绘制扇形,Android自定义扇形倒计时实例代码