作者简介:
邢孟棒,曾供职于阿里、网易,目前在腾讯云专职做性能优化方向。Linux 业余爱好者,偏好钻研各类工具源码与底层技术原理。在日常的性能工程实践中,比较注重方法论的探索、优化案例的沉淀。热衷于 eBPF 技术,擅长传统工具与 BPF 工具的结合应用。
业余时间积极参与 BCC 开源项目的开发,2022 年贡献数量排名首位:https://github.com/iovisor/bcc/pulls/xingfeng2510
一、性能工程师书单推荐
推荐1:《Linux 命令行与 shell 脚本编程大全》
这是一本关于 Linux命令行与shell脚本编程的全方位教程,主要包括四大部分:Linux命令行,shell脚本编程基础,高级shell脚本编程,如何创建实用的shell脚本。尤其推荐阅读第 5 章,帮助理解 shell 执行原理与子 shell 用法。
推荐2:《Linux/Unix 系统编程手册》
个人觉得这本书已超越经典书籍 APUE,非常值得推荐。本书详细描述了 Linux/Unix 系统编程所涉及的逾 500 个系统调用和库函数,并辅之以全面而清晰的逾 200 个程序示例。
推荐3:《Linux 内核设计与实现》
简称LKD,内核新人首选必读的书籍,帮助快速了解 Linux 内核设计与实现。相比大部头 ULK,本书不纠结于太多细节,整体读起来压力较小。
推荐4:《程序员的自我修养:链接、装载与库》
推荐作为深入学习系统软件运行机制和原理的参考书,涉及应用程序在编译、链接和运行时相关实现细节,包括代码指令如何保存,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现等。
推荐5:《性能之巅》
系统学习性能优化必备书籍,尤其是文中提及的性能方法,受益匪浅。本书介绍了操作系统和应用程序的概念、策略、工具和调优,并用基于 Linux 的操作系统作为主要示例。本书的主要内容包括:硬件、内核和应用程序的内部结构,以及它们的工作机制,对复杂系统进行性能分析的方法,针对 CPU、内存、文件系统、磁盘和网络的优化手段,以及如何使用 perf、Ftrace和BPF (BCC和bpftrace)进行复杂的剖析和跟踪。
推荐6:《BPF 之巅》
系统学习 BPF 技术必备书籍。作为一名性能工程师,我在平时的工作中大量使用 BPF 工具,通过观测内核行为协助分析定位性能问题。本书展示了超过150个可以立即使用的 BPF 性能分析工具,对这些工具的应用场景进行了分析,还提供了开发自定义工具的分步指南。在本书中,读者可学习到如何利用 BPF 提供的强大观测能力分析 CPU、内存、存储设备、文件系统、网络、编程语言、应用程序、容器、虚拟机管理器、安全及内核。
二、性能工程常见误区
误区 1:不求甚解,误用或滥用性能工具。
工具、指标与方法是性能分析与优化的三个要素。当遇到性能瓶颈时,恰当的时机选择恰当的性能工具可以事半功倍。然而,想要把性能工具用好,一方面离不开对其所揭示的关键性能指标以及背后基础原理的深入理解,另一方面需要辅以性能方法作理论指导。仅掌握性能工具自身的基础用法,容易误用或滥用,对目标系统产生非必要的副作用(观察者效应)。工具、指标与方法相辅相成,如果能够熟练掌握,那么你已经是一位够格的性能工程师。
误区 2:手忙脚乱,遇到问题时眉毛胡子一把抓。
究其原因,主要是缺少有效的性能方法作理论指导。当面对存在性能问题的复杂系统环境时,好的性能方法可以帮助你更好的了解系统现状,并指导你从哪里开始做分析,什么情况下关注哪些指标以及使用哪些推荐工具。掌握常见的性能方法,例如 USE 方法、CPU 剖析、off-CPU 分析、系统调用分析等,助你逐渐形成遇事不乱、有章可循的优秀职业素养。
误区 3:望而却步,不了解组件实现逻辑难以对其分析。
『怀疑这个组件有问题,但我不太了解它的具体实现逻辑,还是直接找开发者或者熟悉它的人分析一下』这是逃避性能问题的一种常见推辞,实际上却在错失成为高手的机会。我们可以把某个组件当做黑盒去分析,具体的分析手段有很多,比如通过系统资源分析识别出影响业务性能的具体资源、调整网络参数解决业务数据包接收存在延迟抖动问题、CPU 剖析找出热点函数发生的代码路径、off-CPU 分析线程阻塞的具体原因、系统调用分析识别出组件 IO 写延迟存在异常值等等。面对未知问题时不退却,积极迎接,可以让你走在多数人前面。
误区 4:一叶障目,陷入源码细节难以自拔。
在实际工作中,遇到一些同事在处理性能问题时,容易抓住某个可疑点不松手,并陷入到应用或内核源码细节里面跳出不来,偏离问题的实际方向而浪费了较多时间。建立性能全局观作为破解之道,助你及时调整问题的关注重点,避免过早陷入源码细节。
误区 5:安于现状,迈不出改进或创造性能工具的步子。
使用性能工具的三重境界:掌握工具的基本用法、熟练使用且了解工具基本原理、改进工具或创建新工具。当现有工具不能满足你的实际需求时,不妨试着对其进行改进或者创造属于自己的工具。也许你会很快尝到甜头,并且一发不可收拾。