找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5|回复: 1

CPU负载监视器每秒读一次 /proc/stat采样

[复制链接]
发表于 12 分钟前 | 显示全部楼层 |阅读模式
CPU负载监视器每秒读一次 /proc/stat采样

QQ截图20261115181728.png

QQ截图20261115181717.png

QQ截图20261115181703.png

  1. /**
  2. * 案例43:CPU负载监视器每秒读一次 /proc/stat采样
  3. *
  4. * 主要功能:每秒读一次 /proc/stat,用前后两次采样的差值算出整机 CPU 使用率,
  5. * 实时滚动 20 格负载条(█░),超过警戒线立刻 ⚠ 提示;跑完出峰值/谷值/均值/
  6. * 超载轮数统计卡,成绩写 CSV 台账并 stat 复查字节数。
  7. *
  8. * 实际作用:
  9. *   1. 跑重活(打包/备份/批量拉起)前后各测一遍,看谁在吃 CPU、机器扛不扛得住;
  10. *   2. 判断云手机宿主机有没有超售——别人卡顿时你的负载条也跟着爆表就是证据;
  11. *   3. 给录像攒素材:负载条一秒一格滚动,峰谷揭晓自带节奏。
  12. *
  13. * 用法:直接运行,约 25 秒收工。配置:采样轮数/采样间隔毫秒/警戒线(百分比)。
  14. * 写法:Rhino ES5,全 var,函数先定义后调用,main() 末尾启动;等待只用 sleep.millisecond。
  15. */

  16. // ========== 配置区 ==========
  17. var 采样轮数 = 15;
  18. var 采样间隔毫秒 = 1000;
  19. var 警戒线 = 70;
  20. var 落盘目录 = "/sdcard/auto";
  21. var 台账文件 = 落盘目录 + "/CPU负载_台账.csv";

  22. // ========== 一、通道封装 ==========
  23. function adb跑(命令) {
  24.     try {
  25.         var 数据 = JSON.parse(adb.exec(命令, false));
  26.         var 成 = 数据.success == null ? "" : ("" + 数据.success);
  27.         var 错 = 数据.errorMsg == null ? "" : ("" + 数据.errorMsg).trim();
  28.         return { 成: 成, 错: 错 };
  29.     } catch (e) {
  30.         return { 成: "", 错: "exec异常 " + e };
  31.     }
  32. }

  33. function 补零(n) { return n < 10 ? "0" + n : "" + n; }

  34. function 当前时刻() {
  35.     var d = new Date();
  36.     return 补零(d.getHours()) + ":" + 补零(d.getMinutes()) + ":" + 补零(d.getSeconds());
  37. }

  38. function 记台账(行) {
  39.     adb跑("mkdir -p " + 落盘目录);
  40.     adb跑("echo " + 行 + " >> " + 台账文件);
  41. }

  42. // ========== 二、节奏输出 ==========
  43. function 节奏倒计时(秒数, 干什么) {
  44.     for (var i = 秒数; i > 0; i--) {
  45.         printl("⏰ " + i + " 秒后:" + 干什么);
  46.         sleep.millisecond(1000);
  47.     }
  48.     printl("🎬 " + 干什么 + " —— 开始");
  49.     sleep.millisecond(400);
  50. }

  51. // ========== 三、CPU 采样 ==========
  52. // 读 /proc/stat 首行,拆成 {忙, 闲, 总};读不到返回 null
  53. function 读CPU快照() {
  54.     var r = adb跑("cat /proc/stat");
  55.     var m = r.成.match(/cpu\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/);
  56.     if (m == null) return null;
  57.     var user = parseInt(m[1], 10);
  58.     var nice = parseInt(m[2], 10);
  59.     var system = parseInt(m[3], 10);
  60.     var idle = parseInt(m[4], 10);
  61.     var iowait = parseInt(m[5], 10);
  62.     var irq = parseInt(m[6], 10);
  63.     var softirq = parseInt(m[7], 10);
  64.     var 忙 = user + nice + system + irq + softirq;
  65.     var 闲 = idle + iowait;
  66.     return { 忙: 忙, 闲: 闲, 总: 忙 + 闲 };
  67. }

  68. // 两次快照差值算使用率,保留 1 位小数
  69. function 算使用率(上, 今) {
  70.     var 总差 = 今.总 - 上.总;
  71.     if (总差 <= 0) return 0;
  72.     var 忙差 = 今.忙 - 上.忙;
  73.     return Math.round(忙差 / 总差 * 1000) / 10;
  74. }

  75. // 20 格负载条
  76. function 负载条(百分比) {
  77.     var 满格 = Math.round(百分比 / 5);
  78.     if (满格 > 20) 满格 = 20;
  79.     if (满格 < 0) 满格 = 0;
  80.     var 条 = "";
  81.     for (var i = 0; i < 20; i++) {
  82.         条 = 条 + (i < 满格 ? "█" : "░");
  83.     }
  84.     return 条;
  85. }

  86. function 状态标签(百分比) {
  87.     if (百分比 >= 警戒线) return "⚠超载";
  88.     if (百分比 >= 40) return "偏忙";
  89.     return "正常";
  90. }

  91. // 百分比统一带 1 位小数显示
  92. function 补零一(n) {
  93.     var s = "" + n;
  94.     if (s.indexOf(".") < 0) s = s + ".0";
  95.     return s;
  96. }

  97. // ========== 主流程 ==========
  98. function main() {
  99.     printl("=== 案例43 CPU负载监视器 启动:采样 " + 采样轮数 + " 轮,间隔 " + 采样间隔毫秒 + " 毫秒,警戒线 " + 警戒线 + "% ===");
  100.     sleep.millisecond(500);

  101.     节奏倒计时(3, "读取CPU基线(/proc/stat)");
  102.     var 上 = 读CPU快照();
  103.     if (上 == null) {
  104.         printl("❌ /proc/stat 读不到,这台机没有 procfs 通道,收工");
  105.         return;
  106.     }
  107.     printl("📸 基线已取得,开始逐秒采样");
  108.     printl("");

  109.     记台账("时刻,轮次,CPU百分比,状态");

  110.     var 峰 = 0;
  111.     var 峰轮 = 0;
  112.     var 谷 = 101;
  113.     var 谷轮 = 0;
  114.     var 合计 = 0;
  115.     var 超载数 = 0;
  116.     var 实采轮数 = 0;

  117.     for (var 轮 = 1; 轮 <= 采样轮数; 轮++) {
  118.         sleep.millisecond(采样间隔毫秒);
  119.         var 今 = 读CPU快照();
  120.         if (今 == null) {
  121.             printl("❌ 第 " + 轮 + " 轮采样读取失败,提前收工");
  122.             break;
  123.         }
  124.         var 率 = 算使用率(上, 今);
  125.         上 = 今;

  126.         var 标签 = 状态标签(率);
  127.         printl("第 " + 补零(轮) + "/" + 采样轮数 + " 轮  " + 补零一(率) + "%  " + 负载条(率) + "  [" + 标签 + "]");
  128.         记台账(当前时刻() + "," + 轮 + "," + 率 + "," + 标签);

  129.         if (率 > 峰) { 峰 = 率; 峰轮 = 轮; }
  130.         if (率 < 谷) { 谷 = 率; 谷轮 = 轮; }
  131.         if (率 >= 警戒线) 超载数++;
  132.         合计 = 合计 + 率;
  133.         实采轮数++;
  134.     }

  135.     if (实采轮数 === 0) {
  136.         printl("❌ 一轮都没采到,收工");
  137.         return;
  138.     }
  139.     var 均值 = Math.round(合计 / 实采轮数 * 10) / 10;

  140.     printl("");
  141.     printl("========== 📊 负载统计卡 ==========");
  142.     printl("  📈 峰值 : " + 补零一(峰) + "%(第 " + 峰轮 + " 轮)");
  143.     printl("  📉 谷值 : " + 补零一(谷 >= 101 ? 0 : 谷) + "%(第 " + 谷轮 + " 轮)");
  144.     printl("  📊 均值 : " + 补零一(均值) + "%");
  145.     printl("  ⚠ 超载 : " + 超载数 + " / " + 采样轮数 + " 轮(警戒线 " + 警戒线 + "%)");
  146.     if (超载数 === 0) {
  147.         printl("  ✅ 全程没碰警戒线,机器扛得住");
  148.     } else {
  149.         printl("  🔥 有 " + 超载数 + " 轮超载,跑重活前先给它减减负");
  150.     }

  151.     记台账(当前时刻() + ",统计," + 均值 + ",峰" + 峰 + "/谷" + 谷 + "/超载" + 超载数);
  152.     var 查 = adb跑("stat -c %s " + 台账文件);
  153.     if (查.成 !== "") {
  154.         printl("📒 台账已落盘: " + 台账文件 + "(" + 查.成.trim() + " 字节)");
  155.     } else {
  156.         printl("⚠ 台账复查失败: " + 查.错);
  157.     }
  158.     printl("=== 案例43 收工 ===");
  159. }

  160. main();
复制代码



0

主题

3

回帖

6

积分

软件网站新手

积分
6
发表于 4 分钟前 | 显示全部楼层

CPU负载监视器每秒读一次 /proc/stat采样

正好在弄这块,数据先落原始文件再处理,中间出问题能回溯,内存里转两次格式出错就没救了。要判断值不值得投入,就看这个场景一天重复多少次,一天十次的自动化维护成本可能比手工还高。新手别一上来就用大模型,先用规则和组合把流程跑通,性价比高得多。关键流程留个手动兜底入口,自动化跑不通时人能接手比什么都强。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-16 06:53

安卓脚本软件 · 键鼠盒子 · HID · 机械臂

快速回复 返回顶部 返回列表

随机推荐 · 热帖 / 新帖 / 随便看看

最新发布

社区会员(随机展示)