实时系统必须对外部和内部需求做出快速反应。当系统使用多核架构时,交互的速度和数量会急剧上升。虽然这提高了系统性能,但它使应用程序事件的实时排序变得复杂,因为多核系统事件可以在多个独立处理器上同时发生,而不是在单个处理器上顺序发生。
对于多核开发人员而言,管理事件数量及其同时性质的复杂性增加代表了设计更具挑战性的系统。与单处理器系统相比,多核系统诊断系统故障或效率低下的原因要困难得多。由于可用的多核工具很少,开发人员只能使用原始的打印语句技术,这些技术会在整个系统操作过程中留下面包屑,指示有关已发生的各种事件的数据。开发人员必须收集并理解碎屑并推断系统的状态,这一过程通常需要随后重新测量以获得更精细的粒度和重复该过程。
为了有效地解开多核系统上复杂的操作序列,开发人员需要即时回放,使他们能够检查紧接感兴趣区域之前的系统操作。如图 1 所示,一种新型调试工具准确显示了多核系统在特定时间段内发生的情况。所有系统事件的图形分析显示在由应用程序线程组织并按处理器内核分组的单个时间尺度上。
图 1: TraceX 提供多核系统中实时事件的图形视图。在此示例中,可以看到 Core-0 和 Core-1 同时执行不同的线程。
系统事件分析的传统方法
实时程序员早就了解系统行为对其应用程序功能和性能的重要性。传统方法通过切换 I/O 引脚、使用 printf、设置变量或将值写入文件来在代码到达某个阶段时生成有关系统行为的数据来解决这些问题。
插入这样的响应需要大量时间,尤其是考虑到检测代码在第一次时通常不能完全按预期工作,并且必须进行调试。一旦验证了应用程序的该部分,就需要删除检测代码,并且需要对其删除进行调试。大多数检测过程是手动的,因此很耗时并且容易出现额外的错误。
除了检测代码之外,开发人员还需要找到一种方法来解释生成的数据。检测代码生成的大量信息使确定哪些系统事件以何种顺序发生的任务变得复杂。
新方法提供优势
与传统方法相比,TraceX 自动分析并以图形方式描绘运行期间在目标系统上捕获的系统和应用程序事件。线程上下文切换、抢占、暂停、终止和系统中断等事件都会留下调试工具识别和显示的面包屑。这些面包屑描述了刚刚发生的事件、涉及哪个线程、该线程在哪个内核上运行、何时发生以及其他相关信息。
使用此工具,用户可以使用应用程序编程接口 (API) 记录任何所需的应用程序事件。事件信息存储(记录)在目标系统上的循环缓冲区中,缓冲区大小由应用程序确定。循环缓冲区可以随时存储最近的“n”个事件,并可在系统故障或其他重大事件的情况下进行检查。
良好的多核调试工具允许应用程序在特定时间(例如遇到感兴趣的区域时)动态停止和启动事件记录。这样可以避免在系统正常运行时使数据库混乱并消耗目标内存。当遇到断点或系统崩溃或应用程序运行完成后,可以将事件日志上传到主机进行分析。
一旦事件日志从目标内存上传到主机,该工具就会在代表时间的水平轴上以图形方式显示事件(参见图 1)。与事件相关的各种应用程序线程和系统例程沿纵轴列出,事件本身出现在相应的行中。对于多核系统,事件链接到它们各自的处理器内核并分组在一起,以便开发人员可以轻松查看内核的所有事件。
所有事件也显示在顶部摘要行中,无论内核或线程如何,为开发人员提供了一种方便的方式来获取系统事件的完整画面,而无需向下滚动查看所有线程和内核。事件由位于沿水平时间线的发生点以及相关线程或系统例程的右侧的颜色编码图标表示。轴可以展开以显示更多事件详细信息,也可以折叠以显示更多事件。时间刻度可以向左(向后)或向右(向前)平移以显示跟踪缓冲区中的任何点。如图2所示,选择单个事件时,将为该事件提供详细信息,包括核心,上下文,事件,线程指针,新状态,堆栈指针和下一个线程点。
图 2:单击事件图标可以显示单个事件的详细信息。
解决优先级反转问题
最具挑战性的实时问题之一是优先级反转。优先级反转的出现是因为实时操作系统 (RTOS) 采用基于优先级的抢占式调度程序来确保准备好运行的最高优先级线程实际运行。调度程序可以在执行过程中抢占一个较低优先级的线程来满足这个目标。
当高优先级和低优先级线程共享资源(例如内存缓冲区)时,可能会出现问题。如果在高优先级线程准备运行时低优先级线程正在使用共享资源,则高优先级线程必须等待低优先级线程完成。如果较高优先级的线程必须满足关键期限,则必须计算它可能必须等待其所有共享资源的最长时间,以确定其最坏情况下的性能。当 CPU 为低优先级线程提供服务时,高优先级线程被迫等待,就会发生优先级反转。
优先级倒置很难识别和纠正。他们的症状通常是表现不佳,但表现不佳源于许多潜在原因。使确定原因的挑战更加复杂的是,优先级倒置可以逃避测试,这可能意味着倒置是不确定的。
像 TraceX 这样的系统事件工具可以轻松自动地识别优先级反转。跟踪缓冲区清楚地识别在任何时间点正在运行的线程并记录线程就绪状态的任何变化。因此,很容易及时返回以确定较高优先级线程是否已准备好运行但被持有较高优先级线程所需资源的较低优先级线程阻塞。图 3 显示了非确定性优先级反转。
图 3:高优先级线程必须等待低优先级线程在非确定性优先级反转中释放互斥锁。
如此图所示,当 Low_thread 被 High_thread 抢占时,它持有一个互斥锁。High_thread 然后寻找相同的互斥体,但必须等待 Low_thread 释放它。但是,Medium_thread 进行了干预,可以运行不确定的时间长度,不仅延迟了 Low_thread,还延迟了 High_thread。只有当 Medium_thread 为 Low_thread 提供足够的时间以完成其处理并释放互斥锁时,High_thread 才能恢复。
提高应用程序性能
虽然大多数开发人员使用支持多核的工具来理解和纠正问题,但好处并不止于此。这些工具提供了用于分析和改进系统级应用程序性能的执行配置文件。使用执行配置文件,开发人员可以看到每个线程和系统服务使用的 CPU 时间量(参见图 4)。开发人员可以轻松地深入了解特定事件以进行诊断。
图 4:执行配置文件显示每个线程使用的 CPU 时间。
与多核系统操作更相关的是,平衡所有可用内核的处理负载可以实现更大的系统吞吐量。如果系统配置文件提供了有关哪些内核具有较长空闲时间的信息,如图 4 所示,开发人员将获得有关如何将处理转移到其他空闲内核的有力线索。
支持多核的调试工具以标准调试器无法提供的方式绘制系统的图形图像。它为开发人员提供了对中断、上下文切换和其他系统事件的清晰视图,这些事件通常通过耗时的代码检测和对结果数据的繁琐检查来检测。因此,与单独使用标准调试工具相比,开发人员可以在更短的时间内找到并修复错误并优化应用程序性能。由于调试占应用程序开发的 70%,这些工具显着改进了产品,同时减少了开发时间。
审核编辑:郭婷
-
cpu
+关注
关注
68文章
10803浏览量
210787 -
API
+关注
关注
2文章
1471浏览量
61744 -
RTOS
+关注
关注
21文章
809浏览量
119358
发布评论请先 登录
相关推荐
评论