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

开发笔记:linux性能优化动态追踪

篇首语:本文由编程笔记#小编为大家整理,主要介绍了linux性能优化动态追踪相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了linux性能优化动态追踪相关的知识,希望对你有一定的参考价值。






当碰到内核线程的资源使用异常时,很多常用的进程级性能工具并不能直接用到内核线程上。这时可以使用内核自带的perf 来观察它们的行为,找出热点函数,进一步定位性能瓶颈。不过,perf 产生的汇总报告并不直观,所以通常推荐用火焰图来协助排查


一、动态追踪技术

使用perf对系统内核线程进行分析时,内核线程依然还在正常运行中,所以这种方法也被称为动态追踪技术


1.1 动态追踪技术定义

动态追踪技术,通过探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核和应用程序的代码就获得丰富的信息,从而分析、定位想要排查的问题


1.2 以往没有动态追踪时的做法

以往,在排查和调试性能问题时,往往需要:


  1. 先为应用程序设置一系列的断点(比如使用GDB)
  2. 然后以手动或者脚本(比如GDB的Python扩展)的方式在这些断点处分析应用程序的状态,或者增加一系列的日志,从日志中寻找线索

不足:


  1. 断点往往会中断应用的正常运行
  2. 增加新的日志需要重新编译和部署
  3. 大量的性能问题
  4. 难以复现的问题是一个巨大挑战
    出现的概率小,只有线上环境才能碰到的情况

这些方法虽然依然广泛使用,但在排查复杂的性能问题时往往耗时耗力,更会对应用的正常运行造成巨大影响


1.3 动态追踪技术的优势

而动态追踪技术的出现,就为这些问题提供了完美的方案:它既不需要停止服务,也不需要修改应用程序的代码,所有一切还按照原来的方式正常运行就可以协助分析出问题的根源

同时,相比以往的进程级跟踪方法(比如 ptrace),动态追踪往往只会带来很小的性能损耗(通常在5%或者更少)

既然动态追踪有这么多好处,那么都有哪些动态追踪的方法,又该如何使用这些动态追踪方法呢?


二、动态追踪DTrace

说到动态追踪(Dynamic Tracing),就不得不提源于Solaris系统的DTrace。DTrace是动态追踪技术的鼻祖,它提供了一个通用的观测框架,并可以使用D语言进行自由扩展

DTrace的工作原理如下图所示:
在这里插入图片描述
DTrace的运行常驻在内核中,用户可以通过dtrace命令把D语言编写的追踪脚本,提交到内核中的运行时来执行
DTrace可以跟踪用户态和内核态的所有事件,并通过一些列的优化措施保证最小的性能开销

虽然直到现在,DTrace本身依然无法在Linux中运行,但它同样对Linux动态追踪产生了巨大的影响

总的来说,为了追踪内核或用户空间的事件,Dtrace把用户传入的追踪处理函数(一般称为Action)关联到被称为探针的检测点上。这些探针,实际上也就是各种动态追踪技术所依赖的事件源


三、动态追踪的事件源

根据事件类型的不同,动态追踪所使用的事件源可以分为静态探针、动态探针以及硬件事
件等三类。它们的关系如下图所示:

在这里插入图片描述


3.1 静态探针

静态探针,指事先在代码中定义好,并编译到应用程序或者内核中的探针

这些探针只有在开启探测功能时才会被执行到,未开启时并不会执行

常见的静态探针包括内核中的跟踪点(tracepoints)和USDT(Userland Statically Defined Tracing)探针:


  • 跟踪点(tracepoints)

实际上就是在源码中插入的一些带有控制条件的探测点,这些探测点允许事后再添加处理数
比如在内核中,最常见的静态跟踪方法就是printk,即输出日志
Linux内核定义了大量的跟踪点,可以通过内核编译选项来开启或者关闭


  • USDT探针

全称是用户级静态定义跟踪,需要在源码中插入DTRACE_PROBE()代码,并编译到应用程序中
不过,也有很多应用程序内置了USDT探针,比如mysql、PostgreSQL等


3.2 动态探针

动态探针,则是指没有事先在代码中定义,但却可以在运行时动态添加的探针
比如函数的调用和返回等
动态探针支持按需在内核或者应用程序中添加探测点,具有更高的灵活性

常见的动态探针有两种,即用于内核态的kprobes和用于用户态的uprobes:


  • kprobes

用来跟踪内核态的函数,包括用于函数调用的kprobe和用于函数返回的kretprobe


  • uprobes

用来跟踪用户态的函数,包括用于函数调用的uprobe和用于函数返回的uretprobe



注意,kprobes需要内核编译时开启CONFIG_KPROBE_EVENTS,而uprobes则需要内核编译时开启CONFIG_UPROBE_EVENTS



四、动态追踪机制

在这些探针的基础上,Linux提供了一系列的动态追踪机制,比如ftrace、perf、eBPF等


4.1 ftrace

最早用于函数跟踪,后来又扩展支持了各种事件跟踪功能

ftrace的使用接口跟之前提到的procfs类似,它通过debugfs(4.1以后也支持tracefs),以普通文件的形式向用户空间提供访问接口

这样,不需要额外的工具就可以通过挂载点(通常为/sys/kernel/debug/tracing目录)内的文件读写来跟ftrace交互,跟踪内核或者应用程序的运行事件


4.2 perf

一种最简单的静态跟踪机制,可以通过perf来自定义动态事件(perf probe),只关注真正感兴趣的事件


4.3 eBPF

eBPF则在BPF(Berkeley Packet Filter)的基础上扩展而来,不仅支持事件跟踪机制,还可以通过自定义的BPF代码(使用 C 语言)来自由扩展。所以,eBPF实际上就是常驻于内核的运行时,可以说就是Linux版的DTrace

除此之外,还有很多内核外的工具也提供了丰富的动态追踪功能
最常见的就是SystemTap、BCC(BPF Compiler Collection),以及常用于容器性能分析的sysdig等






推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
author-avatar
gsgtqlg_132
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有