Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313465
  • 博文数量: 82
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-13 10:58
文章分类

全部博文(82)

文章存档

2018年(2)

2017年(9)

2016年(71)

我的朋友

分类: 嵌入式

2016-09-20 17:43:15

先看一段代码

  1. local json = require "luci.json"

  2. function get_sys_info()
  3.     local function execute_sys_call(cmd)
  4.         local f = io.popen(cmd)
  5.         local ret = f:read("*all")
  6.         f:close()
  7.         return ret
  8.     end
  9.     
  10.     local function sleep(n)
  11.         local socket = require("socket")
  12.         socket.select(nil, nil, n)
  13.     end
  14.     -- 计算内存占用率
  15.     local totalram = execute_sys_call("cat /proc/meminfo | grep MemTotal | awk '{print $2}' | tr -d '\n'")
  16.     local freeram = execute_sys_call("cat /proc/meminfo | grep MemFree | awk '{print $2}' | tr -d '\n'")        
  17.     local mem_total = string.format("%.0f", totalram / 1024)
  18.     local mem_utilization = string.format("%.2f", 100 * (totalram - freeram ) / totalram )
  19.     -- 计算cpu占用率和核心数
  20.     local cpu_info_1 = execute_sys_call("cat /proc/stat | grep 'cpu ' | awk '{print $2\" \"$3\" \"$4\" \"$5\" \"$6\" \"$7\" \"$8}' | tr -d '\n'")
  21.     local cpu_idle_1 = tonumber(execute_sys_call("echo "..cpu_info_1.." | awk '{print $4}' | tr -d '\n'"))
  22.     local cpu_total_1 = tonumber(execute_sys_call("echo "..cpu_info_1.." | awk '{print $1+$2+$3+$4+$5+$6+$7}' | tr -d '\n'"))
  23.     sleep(0.5)
  24.     local cpu_info_2 = execute_sys_call("cat /proc/stat | grep 'cpu ' | awk '{print $2\" \"$3\" \"$4\" \"$5\" \"$6\" \"$7\" \"$8}' | tr -d '\n'")
  25.     local cpu_idle_2 = tonumber(execute_sys_call("echo "..cpu_info_2.." | awk '{print $4}' | tr -d '\n'"))
  26.     local cpu_total_2 = tonumber(execute_sys_call("echo "..cpu_info_2.." | awk '{print $1+$2+$3+$4+$5+$6+$7}' | tr -d '\n'"))    
  27.     
  28.     local cpu_utilization = string.format("%.2f", 100 * (1 - (cpu_idle_2 - cpu_idle_1) / (cpu_total_2 - cpu_total_1)))        
  29.     local cpu_core = execute_sys_call("cat /proc/stat | grep 'cpu[^ ]' | wc -l | tr -d '\n'")
  30.     -- 获取cpu和内存频率,判断sram类型
  31.     local cpu_mem_freq = execute_sys_call("nvram get clkfreq | tr -d '\n'")
  32.     local cpu_freq = execute_sys_call("echo "..cpu_mem_freq.." | cut -d ',' -f 1 | tr -d '\n'")
  33.     local mem_freq = execute_sys_call("echo "..cpu_mem_freq.." | cut -d ',' -f 2 | tr -d '\n'")
  34.     local mem_type
  35.     local mem_freq_num = tonumber(mem_freq)
  36.     if (mem_freq_num < 450) then
  37.         mem_type = "DDR"
  38.     elseif (mem_freq_num > 450) and (mem_freq_num < 900) then
  39.         mem_type = "DDR2"
  40.     else
  41.         mem_type = "DDR3"
  42.     end
  43.     
  44.     local sys_info = {}
  45.     sys_info.mem_info = {
  46.         mem_total = mem_total, -- MB
  47.         mem_utilization = mem_utilization,
  48.         mem_freq = mem_freq, -- MHz
  49.         mem_type = mem_type
  50.     }
  51.     sys_info.cpu_info = {
  52.         cpu_utilization = cpu_utilization,
  53.         cpu_core = cpu_core,
  54.         cpu_freq = cpu_freq -- MHz
  55.     }
  56.     
  57.     return sys_info
  58. end

  59. print(json.encode(get_cpu_mem_info()))

这是在openwrt系统上运行的lua代码,关于判断cpu和内存频率使用的是nvram命令获取的。这里主要讲一讲/proc/meminfo 和 /proc/stat文件对cpu占用率和内存占用率的计算。

1. 计算cpu占用率
可以参考则篇文章,讲述了多种情况cpu使用率的计算方法
    http://blog.csdn.net/tenfyguo/article/details/7476306
/proc/stat文件内容如下
  1. cpu 122418 0 231542 210673 5053 0 1549 0 0 0
  2. cpu0 61260 0 104805 114565 3564 0 1441 0 0 0
  3. cpu1 61158 0 126737 96108 1489 0 108 0 0 0
  4. intr 299394 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 30215 0 0 0 0 157 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 143569 0 0 0 0 0 114998 0 0 0 0 0 0 0 0 0 10417 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  5. ctxt 857059
  6. btime 1474333415
  7. processes 25190
  8. procs_running 3
  9. procs_blocked 1
  10. softirq 1524730 0 571196 9 46107 10109 0 277960 204748 0 414601   
关于每个字段的含义这两篇文章有详细的解释
    http://www.cnblogs.com/no7dw/archive/2011/07/04/2097300.html
    其中cpu0和cpu1表示有两个逻辑处理器,关于计算处理器数量参考
    http://blog.csdn.net/sycflash/article/details/6643492

这里说明一下前三行cpu信息,从第二到第八分别是
  1. user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
  2. nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
  3. system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
  4. idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
  5. iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
  6. irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
  7. softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
你会发现这和top命令上的cpu那一栏是一一对应的,即求cpu占用率的公式为
  1. (user + nice + system) / (user + nice + system + idle + iowait + irq + softirq)
但这样求得的cpu占用率是从开机后算起的,计算出来相当稳定,反映不出实时cpu占用率,所以我们可以使用两点求斜率的方法获取cpu实时占用率,公式如下
  1. [ (user_1 + nice_1 + system_1) - (user_2 + nice_2 + system_2) ] / [ (user_1 + nice_1 + system_1 + idle_1 + iowait_1 + irq_1 + softirq_1) - (user_2 + nice_2 + system_2 + idle_2 + iowait_2 + irq_2 + softirq_2) ]

2. 计算内存占用率

/proc/meminfo文件内容如下
  1. MemTotal: 255984 kB
  2. MemFree: 144084 kB
  3. Buffers: 6204 kB
  4. Cached: 43088 kB
  5. SwapCached: 0 kB
  6. Active: 24384 kB
  7. Inactive: 35192 kB
  8. Active(anon): 6036 kB
  9. Inactive(anon): 5344 kB
  10. Active(file): 18348 kB
  11. Inactive(file): 29848 kB
  12. Unevictable: 0 kB
  13. Mlocked: 0 kB
  14. SwapTotal: 0 kB
  15. SwapFree: 0 kB
  16. Dirty: 0 kB
  17. Writeback: 0 kB
  18. AnonPages: 10352 kB
  19. Mapped: 5808 kB
  20. Shmem: 1092 kB
  21. Slab: 36052 kB
  22. SReclaimable: 12860 kB
  23. SUnreclaim: 23192 kB
  24. KernelStack: 568 kB
  25. PageTables: 584 kB
  26. NFS_Unstable: 0 kB
  27. Bounce: 0 kB
  28. WritebackTmp: 0 kB
  29. CommitLimit: 127992 kB
  30. Committed_AS: 21200 kB
  31. VmallocTotal: 516096 kB
  32. VmallocUsed: 18164 kB
  33. VmallocChunk: 484908 kB
即及内存占用率为
  1. 100 * (1 - MemFree / MemTotal)


阅读(1939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~