论文部分内容阅读
摘要:随着Linux系统的复杂度越来越高,如何调试并优化系统性能,以提高系统硬件的使用效率,减轻系统负载也越来越重要。其关系到整个产品的成本和使用体验,甚至影响产品上市期限。
虽然在Linux中,有很多开源软件可以用来测量整个系统的性能,但是这些软件同时可能也会引进其他问题,最终导致调试优化过程变得更加复杂。本文将介绍德国的ADIT公司面临的类似问题,并最终如何使用劳特巴赫的TRACE32这一非侵入式硬件跟踪工具来解决这些问题。
关键词:硬件跟踪;调试;Linux
1 Linux软件调试的挑战
德国ADIT(Advanced Driver Information Technology GmbH)的最初方案是在Arm和Intel平台上均部署Linux,使用SystemTap来测量整体系统性能以定位并消除性能瓶颈。SystemTap使用了Linux的一些很好的功能:uprobe和kprobe。这些功能允许用户创建一个动态的跟踪过程,可以分别跟踪用户级别和内核级别的函数。
借助工具来减轻系统负载这个理念本身并没有问题,而且ADIT一开始也期望诸如SystemTap等软件工具仅对整体系统的实时性能产生较小的影响。然而出乎意料的是,使用了这些软件后,Arm平台相较于Intel平台而言,其系统速度的下降幅度明显大于后者。为了确认问题所在,ADIT创建了一个空函数,并且通过uprobe来进行测量。结果表明,在Arm平台上,调用一次uprobe耗费的时间是Intel平台的两倍。因为uprobe内部使用了kprobe,所以最初的怀疑是kprobe导致了前述问题。然而这种怀疑是错误的,因为实际上kprobe在Arm处理器上比在Intel处理器上运行得更快,所以很显然问题出在uprobe代码中。既然问题出在软件跟踪工具的代码中,那么软件跟踪工具就不适合用来解决定位问题。
“因为内核uprobe代码并不简单,一时间我不知道该如何继续。于是我决定使用TRACE32来对之前的问题一探究竟。有些时候,图像是很有帮助的。基于图表,我可以選择部分区域的代码来做更深层次的分析。”ADIT的开发者Frederic Berat说道。
2 TRACE32 PowerTrace硬件跟踪效果
因此,ADIT决定使用TRACE32PowerTrace的硬件跟踪功能,该跟踪功能不会对目标系统的时序有任何影响,同时也允许使用者对最小代码部分进行深入分析。
Arm和Intel设备都能提供非侵入式的程序流信息,Arm的这种技术是ETM(嵌入式跟踪宏单元)Intel相应的技术则是IPT(Intel处理器跟踪)。代码的执行信息会通过一系列专用的引脚传输出来。TRACE32工具连上这些引脚后,无需修改客户任何程序代码,就能够实时收集数据并分析,以此产生应用程序的函数流和每个函数的详细时序。
ADIT的工程师在他们当前的系统状态下,直接连接TRACE32硬件后(如图1),仅需在TRACE32软件的TPIU配置窗口对PortSize和PortMode进行适当选择(如图2),即可获取实时的跟踪数据。整个系统的函数流都会被TRACE32软件重建并以统计的方式进行展现,例如时序图或函数层级图。最终汇总成的这张图表,还原出了一个完整的Linux系统的运行过程,不仅包含内核代码也包含用户代码。根据这张图表,ADIT的工程师们方便地定位到系统时间消耗的关键函数。同时他们也注意到开源性能测试软件kprobe和uprobe给整个系统带来的性能瓶颈。
通过使用TRACE32的高级分析特性,ADIT的工程师们快速地定位出两个明显的问题点(见图3和图4)。最明显的一个瓶颈,就是在Arm平台,uprobe调用了preempt_disable()和preempt_enable()共四次,每一次都需要耗时0.6μs检查栈帧。这样一共导致了2.4μs的迟延。但这个现象在Intel平台上并不会出现。虽然单次调用uprobe引起的2.4μs迟延似乎并不是很长,但因为每秒都调用了很多次,这部分延迟会迅速累积成严重的滞后。再进一步,第二个瓶颈是uprobe调用过程中的字符串操作。并且,受制于Arm和Intel之间的架构差异,这个瓶颈时间并不固定。
如果没有实时跟踪功能,这些瓶颈就几乎很难被发现。而有了实时跟踪功能后,把这些信息跟踪并记录下就很简单。明确了从何处着手调查,通过对跟踪结果的分析,ADIT的工程师确认主要问题在于内核配置。在跨平台迁移过程中,CONFIG_PREEMPT_TRACE这个配置项被无意地使用了。跟踪结果显示,这个配置被打开后,在Arm平台会导致栈展开,但在Intel平台并没有影响,而正是这导致了两个平台之间明显的性能差异。
3结论
通过本文案例可以看出,在Linux系统性能分析和优化过程中,基于硬件的非侵入式实时跟踪技术,不仅可以实现开源跟踪软件的所有功能,而且也可以对Boot相关的代码进行跟踪分析,同时还避免引进一些其他问题,并且统计结果更准确、数据分析形式更灵活。
虽然在Linux中,有很多开源软件可以用来测量整个系统的性能,但是这些软件同时可能也会引进其他问题,最终导致调试优化过程变得更加复杂。本文将介绍德国的ADIT公司面临的类似问题,并最终如何使用劳特巴赫的TRACE32这一非侵入式硬件跟踪工具来解决这些问题。
关键词:硬件跟踪;调试;Linux
1 Linux软件调试的挑战
德国ADIT(Advanced Driver Information Technology GmbH)的最初方案是在Arm和Intel平台上均部署Linux,使用SystemTap来测量整体系统性能以定位并消除性能瓶颈。SystemTap使用了Linux的一些很好的功能:uprobe和kprobe。这些功能允许用户创建一个动态的跟踪过程,可以分别跟踪用户级别和内核级别的函数。
借助工具来减轻系统负载这个理念本身并没有问题,而且ADIT一开始也期望诸如SystemTap等软件工具仅对整体系统的实时性能产生较小的影响。然而出乎意料的是,使用了这些软件后,Arm平台相较于Intel平台而言,其系统速度的下降幅度明显大于后者。为了确认问题所在,ADIT创建了一个空函数,并且通过uprobe来进行测量。结果表明,在Arm平台上,调用一次uprobe耗费的时间是Intel平台的两倍。因为uprobe内部使用了kprobe,所以最初的怀疑是kprobe导致了前述问题。然而这种怀疑是错误的,因为实际上kprobe在Arm处理器上比在Intel处理器上运行得更快,所以很显然问题出在uprobe代码中。既然问题出在软件跟踪工具的代码中,那么软件跟踪工具就不适合用来解决定位问题。
“因为内核uprobe代码并不简单,一时间我不知道该如何继续。于是我决定使用TRACE32来对之前的问题一探究竟。有些时候,图像是很有帮助的。基于图表,我可以選择部分区域的代码来做更深层次的分析。”ADIT的开发者Frederic Berat说道。
2 TRACE32 PowerTrace硬件跟踪效果
因此,ADIT决定使用TRACE32PowerTrace的硬件跟踪功能,该跟踪功能不会对目标系统的时序有任何影响,同时也允许使用者对最小代码部分进行深入分析。
Arm和Intel设备都能提供非侵入式的程序流信息,Arm的这种技术是ETM(嵌入式跟踪宏单元)Intel相应的技术则是IPT(Intel处理器跟踪)。代码的执行信息会通过一系列专用的引脚传输出来。TRACE32工具连上这些引脚后,无需修改客户任何程序代码,就能够实时收集数据并分析,以此产生应用程序的函数流和每个函数的详细时序。
ADIT的工程师在他们当前的系统状态下,直接连接TRACE32硬件后(如图1),仅需在TRACE32软件的TPIU配置窗口对PortSize和PortMode进行适当选择(如图2),即可获取实时的跟踪数据。整个系统的函数流都会被TRACE32软件重建并以统计的方式进行展现,例如时序图或函数层级图。最终汇总成的这张图表,还原出了一个完整的Linux系统的运行过程,不仅包含内核代码也包含用户代码。根据这张图表,ADIT的工程师们方便地定位到系统时间消耗的关键函数。同时他们也注意到开源性能测试软件kprobe和uprobe给整个系统带来的性能瓶颈。
通过使用TRACE32的高级分析特性,ADIT的工程师们快速地定位出两个明显的问题点(见图3和图4)。最明显的一个瓶颈,就是在Arm平台,uprobe调用了preempt_disable()和preempt_enable()共四次,每一次都需要耗时0.6μs检查栈帧。这样一共导致了2.4μs的迟延。但这个现象在Intel平台上并不会出现。虽然单次调用uprobe引起的2.4μs迟延似乎并不是很长,但因为每秒都调用了很多次,这部分延迟会迅速累积成严重的滞后。再进一步,第二个瓶颈是uprobe调用过程中的字符串操作。并且,受制于Arm和Intel之间的架构差异,这个瓶颈时间并不固定。
如果没有实时跟踪功能,这些瓶颈就几乎很难被发现。而有了实时跟踪功能后,把这些信息跟踪并记录下就很简单。明确了从何处着手调查,通过对跟踪结果的分析,ADIT的工程师确认主要问题在于内核配置。在跨平台迁移过程中,CONFIG_PREEMPT_TRACE这个配置项被无意地使用了。跟踪结果显示,这个配置被打开后,在Arm平台会导致栈展开,但在Intel平台并没有影响,而正是这导致了两个平台之间明显的性能差异。
3结论
通过本文案例可以看出,在Linux系统性能分析和优化过程中,基于硬件的非侵入式实时跟踪技术,不仅可以实现开源跟踪软件的所有功能,而且也可以对Boot相关的代码进行跟踪分析,同时还避免引进一些其他问题,并且统计结果更准确、数据分析形式更灵活。