作者:Tejun Heo(Facebook的软件工程师)和Thomas Connally。
Facebook工程文化的一个组成部分始终是我们的开发团队致力于开发开源解决方案,以解决实际的生产问题,并应对现代大规模云计算的重大挑战。今天,我们宣布了一套解决重要的计算集群(fleet)管理问题的开源Linux内核组件和相关工具。这些包括资源控制、资源利用、工作负载隔离、负载均衡、测量和监控等方面的工具。
Facebook的内核和内核应用程序开发人员与各内部团队合作,开发解决Facebook数据中心中诸多问题的技术,这也是整个行业中的许多企业共同面临的挑战。下列产品现在已大规模用于Facebook所有基础设施的生产环境中,并用于其他许多企业组织的环境中。
BPF
BPF是Linux内核中一种高度灵活、高效率的代码执行引擎,让字节码可以在各个钩子点(hook point)运行,以便可以使用自定义代码,安全而轻松地改动内核行为。虽然BPF已广泛用于数据包过滤,但是BPF的指令集具有很强的通用性和灵活性,足以支持和允许除网络之外的众多使用场合,比如跟踪和安全(比如沙盒)。
在Facebook,为我们的用户确保快速而可靠的访问是首要任务。为了实现这个目标,我们的基础设施工程师开发出了多个流量优化系统,BPF在这些系统中发挥着重要作用。其中一个例子是Katran,这是一种基于软件的负载均衡解决方案,完全重新设计的转发平面可充分利用BPF虚拟机。Katran转发平面软件库为Facebook基础设施中所用的网络负载均衡器提供支持,帮助提高了网络负载均衡的性能和可扩展性,同时大大减少了低效率现象。
Btrfs
Btrfs是下一代文件系统,设计时考虑到了如今的数据中心。它是一种写时拷贝(CoW)文件系统,专注于高级功能的实现、容错、修复和易于管理。Btrfs旨在应对和管理大型存储子系统,并支持快照、联机碎片整理、池化(pooling)和集成的多设备支持等功能。
在许多不同的应用环境下,Btrfs为Facebook的数据中心提高效率和资源利用率发挥了作用。最近,Btrfs与cgroup2(下文有介绍)一起用于I/O控制,帮助消除了之前文件系统的日志行为引起的优先级倒置(priority inversion)。Btrfs是目前实现的唯一与资源隔离机制协同使用的文件系统,现在它部署在数百万台服务器上,大幅提高了效率。
Netconsd
Netconsd是一个基于UDP的netconsole守护程序,为Linux netconsole消息提供轻量级传输机制。它接收并处理来自Linux内核的日志数据,并将该数据作为结构化数据来提供,帮助生产级工程师迅速识别计算集群中的问题。
在Facebook,netconsd提供了重要的数据中心统计数据。它可以持续记录来自数百万个主机的数据,让工程师得以从内核中生成的一大堆日志数据中提取有意义的信号,帮助随叫随到的生产级工程师迅速识别和诊断行为异常的服务。
Cgroup2
Cgroup2是下一代Linux内核机制,用于工作负载的分组和安排,并控制分配给每个组的系统资源数量。它拥有面向内存、I/O、中央处理单元及更多部件的控制器。它还让你可以隔离工作负载,为每个工作负载配置资源分配,并确定优先级。
借助更好地处理内存过量分配以及内存变得稀缺时进行减载(load shedding)等策略,使用cgroup2实现的资源控制正在推动Facebook的数据中心在多租户机制方面大有改进。它改善Facebook计算集群的资源利用率的方法是,将系统的主要工作负载与广泛分布的系统二进制文件以及在Facebook主机上运行的其他系统服务隔离开来,并加以保护。
为这些系统二进制文件保留的资源被称为fbtax,fbtax后来成了解决Facebook计算集群中优先级倒置及其他资源分配问题的那个项目的名称。fbtax项目表明了在使用内存管理和文件系统等操作系统功能时有望实现全面的资源隔离,因而为此创造了机会:使工作负载堆叠起来简单又安全,从而提高计算集群的效率。想了解详细信息,请查看cgroup2文档中的fbtax2案例研究(https://facebookmicrosites.github.io/cgroup2/docs/overview.html#case-study-the-fbtax2-project)。
PSI
Pressure Stall Information(PSI)首次提供了一种堪称典范的方法:借助内存、CPU和I/O这三种主要资源的新pressure指标,量化资源短缺。这些pressure指标与这次一起开源的其他内核和用户空间工具相结合,便于开发团队在开发和智能响应时可以检测资源短缺情况。PSI统计数据为即将发生的资源短缺提供了预警功能,因而实现更主动、更细致、更准确的响应。
我们Facebook将PSI与cgroup2结合使用,以便针对每个cgroup深入了解众多不同工作负载的资源使用(和滥用)情况,从而在资源不足的情况下提高利用率和可靠性。
该图显示了各个组件和工具如何协同工作
Oomd
Oomd是一个用户空间OOM(内存溢出)进程终止工具,它在使用时可以更好地了解系统上运行的进程的上下文和优先级。它让你可以配置对OOM条件作出的响应,比如暂停或终止非必需项、重新分配系统中的内存或执行其他操作。
在过去,OOM终止在内核里面进行。如果系统耗尽了物理内存,Linux内核将被迫对一个或多个进程执行OOM终止。这番操作通常缓慢而痛苦,原因是只有在内核本身无法进入到下一步时,内核才触发:它缺乏了解应用程序运行状况的任何方式,常常导致抖动(thrashing)行为,即内核认为条件正常,但应用程序受到影响。除了这个行为之外,策略配置起来复杂且不灵活。Oomd通过OOM在内核中出现之前采取纠正措施来解决用户空间中的这些问题。支持自定义检测逻辑的一个灵活的插件系统可配置这些操作。Oomd让你可以为每个工作负载编写自定义保护规则。
在Facebook的数据中心,Oomd与PSI指标和cgroup2结合使用,提高了可靠性和效率,有助于大幅增加容量并大幅提升资源利用率。
前景无限
这里描述的使用场合仅仅是个开端。这次发布的开源内核组件和工具稍加调整,注有望解决几乎无穷无尽的生产问题。Facebook继续使用这些工具来开发和部署解决方案。我们相信,这一批服务和产品将有助于任何开发人员构建在多个平台上为数百万用户提供服务的应用软件。
我们很高兴向开源社区发布这些解决方案,但愿它们帮助其他人解决类似的生产问题、开发创新的用途。