购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
引言

在过去的几十年里,计算机系统变得越来越复杂。人们创建了很多办法来了解软件的行为,试图解决对复杂系统进行洞察的挑战。日志是很好的信息来源,常用于获得应用程序可见性。日志为分析应用程序的行为提供了精确数据。然而,日志分析的方法受制于应用开发者暴露的日志内容。如果想要收集系统中日志格式以外的信息,则变得和反编译程序来查看执行流一样有挑战。另外一种流行的方法是使用度量来推断程序的行为。度量与日志有所不同,日志提供的是显性数据,而度量是通过数据聚合对一个程序在特定时间点的行为进行衡量。

可观测性是一种新兴的实践,尝试从不同角度来解决问题。可观测性被定义成一种能力,可以对给定系统提出的任意问题,寻求到复杂的答案。可观测性、日志和度量聚合三者的主要区别是收集的数据内容。如果可观测性的实践需要随时随地回答任意问题,那么唯一可行的方式就是收集系统中生成的所有数据,在需要回答问题的时候聚合收集到的数据。

Nassim Nicholas Taleb的畅销书Antifragile:Things That Gain From Disorder(Penguin Random House出版社),书中提到的广为人知的“黑天鹅”事件(“黑天鹅”事件指产生重大后果的意外事件),如果在事件发生前就进行观测,事件是可预料的。在作者的另一本书The Black Swan(Penguin Random House出版社)中,他解释了在一些罕见的事件中,拥有相关数据是如何帮助降低风险的。“黑天鹅”事件在软件工程中比我们想象的更常见,而且无法避免。假设我们无法预防这类事件,唯一的选择就是在不影响业务系统的前提下,获得尽可能多的信息来解决问题。可观测性有助于我们构建健壮的系统,减少“黑天鹅”事件的发生。它的前提条件是我们正在收集的任何数据都能回答未来的任何问题。所以,我们认为对于“黑天鹅”事件的研究和可观测性的实践,核心是从系统中收集到的数据。

Linux容器是Linux内核实现进程隔离和管理进程的一系列特性的抽象。传统上内核负责资源管理,并提供任务隔离和安全。在Linux系统中,容器基于内核的命名空间和cgroups特性。命名空间将任务彼此隔离。在一个命名空间内,你仿佛看不到系统内其他任务在运行。cgroups是提供资源管理的组件。从操作的角度看,cgroups对资源使用提供了细粒度控制,例如,CPU、磁盘I/O、网络等。在过去的十年里,随着Linux容器的普及,软件工程师设计大型分布式系统和计算平台的方式已经发生变化。多租户计算平台已经完全依赖于内核中的这些特性。

因为非常依赖Linux内核底层的功能,当设计可观测性系统时,我们需要考虑新的复杂性和信息来源。内核是一个基于事件的系统,这意味着所有的工作都可以用事件来描述和执行。打开文件是一种事件,执行一个CPU任意指令是一个事件,接收网络数据包是一个事件,等等。Berkeley Packet Filter(BPF)是内核中的子系统,用于检测这些事件来源。你可以使用BPF编写内核触发事件时安全执行的程序。BPF提供强大的安全保障,用来防止程序注入导致系统崩溃和阻止程序的恶意行为。同时,BPF正在启用一些新的工具来帮助系统开发人员对新平台进行观测和操作。

在本书中,我们将描述BPF所提供的能力,这些能力可以使任何计算系统具有更好的可观测性。我们还将描述如何使用多种编程语言编写BPF程序。我们把程序代码放在GitHub上,所以你不需要复制和粘贴。你可以在Git仓库找到本书的代码( https://oreil.ly/lbpf-repo )。

在开始研究BPF技术之前,让我们先来了解BPF的来龙去脉。 uauocf1ElaP2kqJke66NSN62cCCx7QILvMvwNdzL8QYqShp8gSG/kZL0pYiITOj9

点击中间区域
呼出菜单
上一章
目录
下一章
×