gtop源码深度剖析:lib/monitor模块如何实现CPU与内存数据采集

【免费下载链接】gtop System monitoring dashboard for terminal 【免费下载链接】gtop 项目地址: https://gitcode.com/gh_mirrors/gt/gtop

你是否曾好奇终端中的系统监控工具如何实时展示CPU占用率和内存使用情况?gtop作为一款轻量级终端监控工具,其lib/monitor模块通过精巧的设计实现了高效的数据采集与可视化。本文将带你深入探索CPU与内存监控的实现原理,剖析从系统调用到数据展示的完整链路。

模块架构概览

lib/monitor目录是gtop的核心监控模块,包含六个核心文件:

这些模块通过统一接口向主程序提供数据,形成了模块化的监控体系。

CPU监控实现原理

数据采集机制

cpu.js采用周期性采样机制,通过systeminformation库的currentLoad接口获取CPU使用率数据:

// 初始化时获取CPU数据
si.currentLoad(data => {
  this.cpuData = data.cpus.map((cpu, i) => ({
    title: 'CPU' + (i + 1),
    style: { line: colors[i % colors.length] },
    x: Array(61).fill().map((_, i) => 60 - i),
    y: Array(61).fill(0),
  }));
  this.updateData(data);
  
  // 设置1秒轮询间隔
  this.interval = setInterval(() => {
    si.currentLoad(data => this.updateData(data));
  }, 1000);
});

数据处理与可视化

updateData方法负责将原始数据转换为图表所需格式,通过滑动窗口维护60秒的历史数据:

Cpu.prototype.updateData = function(data) {
  data.cpus.forEach((cpu, i) => {
    // 格式化负载字符串
    var loadString = cpu.load.toFixed(1).toString();
    while (loadString.length < 6) loadString = ' ' + loadString;
    loadString += '%';
    
    // 更新标题与数据序列
    this.cpuData[i].title = 'CPU' + (i + 1) + loadString;
    this.cpuData[i].y.shift();  // 移除最旧数据点
    this.cpuData[i].y.push(cpu.load);  // 添加新数据点
  });
  
  // 更新图表并渲染
  this.line.setData(this.cpuData);
  this.line.screen.render();
};

多核心支持

代码通过data.cpus数组自动适配不同核心数的CPU,为每个核心创建独立的数据序列和样式,实现了多核心并行监控。

内存监控实现细节

内存数据结构

mem.js维护了内存和交换分区两套独立的数据序列,初始化代码如下:

this.memData = [
  {
    title: 'Memory',
    style: { line: colors[0] },
    x: Array(61).fill().map((_, i) => 60 - i),
    y: Array(61).fill(0),
  },
  {
    title: 'Swap',
    style: { line: colors[1] },
    x: Array(61).fill().map((_, i) => 60 - i),
    y: Array(61).fill(0),
  },
];

数据计算与格式化

内存使用率计算采用以下公式:

// 计算内存使用率百分比
var memPer = (100 * (1 - data.available / data.total)).toFixed();
// 计算交换分区使用率
var swapPer = (100 * (1 - data.swapfree / data.swaptotal)).toFixed();

数据格式化使用工具函数将字节转换为人类可读格式:

// 内存使用情况标题格式化
var memTitle = utils.humanFileSize(data.total - data.available) + 
              ' of ' + utils.humanFileSize(data.total);

双图表联动展示

内存模块同时更新折线图和环形图(Donut)两种可视化组件:

// 更新折线图数据
this.line.setData(this.memData);

// 更新内存环形图
this.memDonut.setData([{
  percent: memPer / 100,
  label: memTitle,
  color: colors[0],
}]);

// 更新交换分区环形图
this.swapDonut.setData([{
  percent: swapPer / 100,
  label: swapTitle,
  color: colors[1],
}]);

数据流转与可视化流程

gtop的监控数据从采集到展示经历以下流程:

  1. 数据采集:通过systeminformation库获取系统原始数据
  2. 数据处理:格式化、计算百分比、维护历史数据队列
  3. 状态更新:更新图表组件数据
  4. 界面渲染:调用sync.render()更新终端界面

gtop运行界面

性能优化策略

资源占用控制

  • 采用1秒采样间隔平衡实时性与资源消耗
  • 使用固定大小(61个点)的数组存储历史数据,避免内存泄漏
  • 模块化设计使各监控功能可独立启停

渲染优化

通过只更新变化的数据而非重绘整个界面,lib/gtop.js中的终端渲染逻辑确保了流畅的用户体验,即使在资源受限的环境中也能保持稳定运行。

总结与扩展

lib/monitor模块通过优雅的设计实现了全面的系统监控功能,其核心优势在于:

  1. 模块化架构:各监控功能独立封装,便于维护和扩展
  2. 自适应设计:自动适配不同硬件配置(CPU核心数、内存大小等)
  3. 高效数据处理:精简的数据结构和更新算法减少资源消耗

开发者可以通过扩展该模块添加新的监控指标,或修改采样频率和数据保留策略以适应特定需求。完整实现请参考lib/monitor目录下的源代码。

【免费下载链接】gtop System monitoring dashboard for terminal 【免费下载链接】gtop 项目地址: https://gitcode.com/gh_mirrors/gt/gtop

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐