作者:MiltonW_825 | 来源:互联网 | 2024-12-18 19:36
QNX 微内核(procnto-instr)的监测版本集成了高级别的跟踪与分析功能,支持实时监控系统运行状态。此模块既适合单CPU环境,也适用于SMP(对称多处理器)系统。
procnto-instr 模块具有低开销和高性能的特点——在不进行记录的情况下,其性能几乎与标准内核相当,通常仅慢约2%。尽管增加了大约30KB的代码量(针对x86系统),这一增加对于获取强大的工具功能和灵活性来说是微不足道的。根据最终产品的尺寸需求,可以选择将其作为开发工具或直接用于生产环境。
监测模块的设计是非侵入性的,即无需修改程序源码即可监控程序与内核的交互。用户可以灵活地选择监控内核与系统中任一线程或进程间的多种交互,包括但不限于内核调用、状态变更及其他系统活动,甚至中断处理。这些活动在监测过程中被统称为事件。
监测概览
内核监测的核心任务包括:
- 因各种系统活动触发,微内核(procnto-instr)产生跟踪事件,并将这些事件复制到一个环形缓冲区中。
- 当缓冲区中的事件数量达到预设阈值时,内核会通知数据采集工具。
- 数据采集工具随后将缓冲区中的跟踪事件写入输出设备,如串行端口或事件文件等。
- 最后,数据解析工具对事件进行解读,并将结果呈现给用户。
事件控制
考虑到实时系统中发生的活动数量庞大,内核产生的事件量可能会非常大,这对数据量、处理能力和存储资源都是考验。然而,用户可以轻松控制输出的数据量,通过设置初始条件、应用预定义的内核过滤器或自定义事件处理器等方式来动态管理事件的生成。
数据采集工具(如 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 数据解析器收集的输出结果如下所示: