QNX system architecture -- Chapter 4:The Instrumented Microkernel

微内核(procnto-instr)的检测版本配备了复杂的跟踪和分析机制,可让您实时监控系统的执行情况。procnto-instr模块适用于单CPU和SMP系统。

procnto-instr 模块使用非常少的开销并且提供了非常好的性能 - 它通常比非器械内核(当它不记录时)快98%。仪表内核中额外的代码量(x86系统上大约30 KB)对于这个有用工具的附加功能和灵活性来说是一个相对较小的代价。根据最终系统的占地面积要求,您可以选择将此特殊内核用作开发/原型设计工具或最终产品中的实际内核。

检测模块是非侵入式的 - 您不必修改程序的源代码以监视程序与内核的交互方式。 您可以根据需要在内核与系统中任何正在运行的线程或进程之间跟踪多个或几个交互(例如,内核调用,状态更改和其他系统活动)。你甚至可以监控中断。在这种情况下,所有这些活动都称为事件。

Instrumentation at a glance

以下是内核检测中涉及的基本任务:

  1. 由于各种系统活动,微内核(procnto-instr)会发出跟踪事件。这些事件会自动复制到一组分组为循环链表的缓冲区中。

  2. 一旦缓冲区内的事件数达到高水位线,内核就会通知数据捕获实用程序。

  3. 数据捕获程序,然后写入从所述缓冲器中的跟踪事件到输出装置(例如,一个串行端口,一个事件文件,等)。

  4. 数据解读机构随后解释事件,并提出这些数据给用户。

Event control

鉴于在实时系统中发生的大量活动,内核发出的事件数量可能是巨大的(就数据量,处理要求和存储它所需的资源而言)。 但您可以轻松控制发出的数据量。

具体来说,您可以:

•控制触发事件发射的初始条件
•应用预定义的内核过滤器来动态控制排放
•实现自己的事件处理程序以进行更多过滤。

数据捕获实用程序(tracelogger)收集数据后,即可对其进行分析。您可以在收集相关事件后实时或离线分析数据。IDE中的系统分析工具以图形方式显示此数据,以便您“查看”系统中发生的情况。

Modes of emission

除了应用各种过滤器来控制事件流之外,您还可以指定内核可用于发出事件的两种模式之一:

这里的权衡是速度与知识之间的关系:快速模式提供的数据较少,而宽模式为每个事件包含更多信息。无论哪种方式,您都可以轻松调整系统,因为这些模式基于每个事件。

作为快速和宽发射模式之间差异的一个例子,让我们看看我们可能看到的MsgSendv()调用条目的信息种类:

Ring buffer

内核可以将所有跟踪事件保存在内部循环缓冲区中,而不是始终向外部设备发送事件。

当满足某个触发条件时,可以按需编程将此缓冲区转储到外部设备,这使得它成为识别在某些运行时条件下出现的难以捉摸的错误的非常强大的工具。

Data interpretation

event数据包括高精度时间戳以及生成event的CPU的ID号。此信息可帮助您轻松诊断困难的计时问题,这些问题更可能发生在多处理器系统上。

事件格式还包括CPU平台(例如,x86,ARM等)和endian类型,这有助于远程分析(无论是实时还是离线)。使用数据解释器,您可以通过各种方式查看数据输出,例如:

•基于时间戳的整个系统的线性表示
•仅活动线程/进程的“运行”视图
•每个进程/线程的事件的基于状态的视图。
数据解释器的线性输出可能如下所示:

为了帮助您微调对事件数据流的解释,我们提供了一个库(traceparser),您可以编写自己的自定义事件解释器。

System analysis with the IDE

System Analysis Toolkit(SAT)的IDE模块可用作综合仪器控制和后处理可视化工具。

在IDE中,开发人员可以配置所有跟踪事件和模式,然后自动将日志文件传输到远程系统进行分析。作为可视化工具,IDE提供了一组丰富的事件和流程过滤器,旨在帮助开发人员快速删除大量事件集,以便仅查看感兴趣的事件。

Proactive tracing

虽然检测内核为仪器和监视进程,线程以及系统状态提供了极好的不显眼方法,但您也可以让应用程序主动影响事件收集过程。

使用TraceEvent()库调用,应用程序本身可以将自定义事件注入跟踪流。 在构建大型,紧密耦合的多组件系统时,此功能特别有用。
例如,以下简单调用会将事件代码的整数值(第一个和第二个)注入事件流:

您还可以将一个字符串(例如,“我的事件”)注入事件流,如以下代码所示:

#include <stdio.h>
#include <sys/trace.h>
/* Code to associate with emitted events */
#define MYEVENTCODE 12
int main(int argc, char **argv) {
printf("My pid is %d \n", getpid());
/* Inject two integer events (26, 1975) */
TraceEvent(_NTO_TRACE_INSERTSUSEREVENT, MYEVENTCODE,
26, 1975);
/* Inject a string event (My Event) */
TraceEvent(_NTO_TRACE_INSERTUSRSTREVENT, MYEVENTCODE,
"My Event");
return 0;
}

由traceprinter数据解释器收集的输出看起来像这样:

源文件:《The Instrumented Microkernel》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值