热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QNX系统架构第四章:仪表化微内核

QNX微内核(procnto-instr)的监测版本内置了高级跟踪与分析工具,能够实现实时系统监控。该模块适用于单处理器及多处理器系统。

QNX 微内核(procnto-instr)的监测版本集成了高级别的跟踪与分析功能,支持实时监控系统运行状态。此模块既适合单CPU环境,也适用于SMP(对称多处理器)系统。

procnto-instr 模块具有低开销和高性能的特点——在不进行记录的情况下,其性能几乎与标准内核相当,通常仅慢约2%。尽管增加了大约30KB的代码量(针对x86系统),这一增加对于获取强大的工具功能和灵活性来说是微不足道的。根据最终产品的尺寸需求,可以选择将其作为开发工具或直接用于生产环境。

监测模块的设计是非侵入性的,即无需修改程序源码即可监控程序与内核的交互。用户可以灵活地选择监控内核与系统中任一线程或进程间的多种交互,包括但不限于内核调用、状态变更及其他系统活动,甚至中断处理。这些活动在监测过程中被统称为事件。

监测概览

内核监测的核心任务包括:

  1. 因各种系统活动触发,微内核(procnto-instr)产生跟踪事件,并将这些事件复制到一个环形缓冲区中。
  2. 当缓冲区中的事件数量达到预设阈值时,内核会通知数据采集工具。
  3. 数据采集工具随后将缓冲区中的跟踪事件写入输出设备,如串行端口或事件文件等。
  4. 最后,数据解析工具对事件进行解读,并将结果呈现给用户。

事件控制

考虑到实时系统中发生的活动数量庞大,内核产生的事件量可能会非常大,这对数据量、处理能力和存储资源都是考验。然而,用户可以轻松控制输出的数据量,通过设置初始条件、应用预定义的内核过滤器或自定义事件处理器等方式来动态管理事件的生成。

数据采集工具(如 tracelogger)收集数据后,用户可以在收集到相关事件后立即或稍后进行分析。集成开发环境(IDE)中的系统分析工具以图形界面展示这些数据,使用户能够直观地了解系统内部的运作情况。

事件生成模式

除了使用过滤器控制事件流外,还可以指定内核采用两种不同的事件生成模式之一,这两种模式分别为快速模式和详细模式。快速模式下,每个事件携带的信息较少,而详细模式则包含更多细节。这种灵活性允许用户根据需要调整系统设置,因为每种模式都是针对单个事件的。

环形缓冲区

内核可以将所有跟踪事件存储在一个内部环形缓冲区中,而不是直接发送到外部设备。当特定条件被触发时,可以编程将缓冲区内容转储至外部设备,这对于捕捉在特定运行条件下出现的难以发现的问题非常有效。

数据解析

事件数据包含高精度的时间戳和生成事件的CPU ID,这有助于诊断多处理器系统中常见的复杂定时问题。事件格式还记录了CPU平台(如 x86、ARM 等)和字节序类型,便于远程实时或离线分析。利用数据解析工具,用户可以从多个角度查看数据输出,例如系统的时间线视图、活动线程/进程的运行视图以及基于状态的进程/线程事件视图。

为了帮助用户更好地解析事件数据流,我们提供了一个库(traceparser),用户可以利用这个库编写自定义的数据解析器。

使用 IDE 进行系统分析

系统分析工具包(SAT)的 IDE 模块不仅作为综合的仪器控制工具,也是强大的后处理可视化工具。在 IDE 中,开发人员可以配置所有的跟踪事件和模式,并自动将日志文件传输到远程系统进行分析。作为可视化工具,IDE 提供了一系列丰富的事件和流程过滤器,旨在帮助开发人员迅速筛选出大量事件集合中的关键信息,以便专注于感兴趣的事件。

主动追踪

虽然监测内核为系统进程、线程和状态的仪器化和监控提供了透明的方法,但应用程序也可以主动参与事件收集过程。通过使用 TraceEvent() 库调用,应用程序可以直接向跟踪流中插入自定义事件。这一功能在构建大型、紧密耦合的多组件系统时尤为重要。

例如,下面的代码展示了如何通过简单的函数调用来向事件流中添加两个整数值事件(26, 1975)和一个字符串事件(“My Event”):

#include 
#include

#define MYEVENTCODE 12

int main(int argc, char **argv) {
printf("My pid is %d \n", getpid());
// 向事件流中插入两个整数事件 (26, 1975)
TraceEvent(_NTO_TRACE_INSERTSUSEREVENT, MYEVENTCODE, 26, 1975);
// 向事件流中插入一个字符串事件 (My Event)
TraceEvent(_NTO_TRACE_INSERTUSRSTREVENT, MYEVENTCODE, "My Event");
return 0;
}

使用 traceprinter 数据解析器收集的输出结果如下所示:


推荐阅读
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 本文介绍了两种使用Java发送短信的方法:利用第三方平台的HTTP请求和通过硬件设备短信猫。重点讲解了如何通过Java代码配置和使用短信猫发送短信的过程,包括必要的编码转换、串口操作及短信发送的核心逻辑。 ... [详细]
  • 本文介绍了如何通过ARM编译器组件重定向标准C运行时库的I/O函数,以适应不同的硬件平台。原文链接:https://www.keil.com/pack/doc/compiler/RetargetIO/html/retarget_overview.html ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 在Java开发中,使用BASE64编码通常可以直接利用JDK内置的库。然而,在Android平台上,由于安全性和兼容性的考虑,直接引用JDK中的`sun.misc.BASE64Decoder`会导致错误,因此需要引入第三方库来实现相同的功能。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • Chapter11&12:DefocusBlur&FinalScene在Camera.h中修改如下:#pragmaonce#define_USE ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
author-avatar
MiltonW_825
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有