Meta 如何为超大规模 Linux 打补丁

admin 2023-12-19 09:03:36 游戏资讯 25 ℃ 0 评论 请在这里放置你的在线分享代码

  弗吉尼亚州里士满——任何懂技术的人都可以给Linux服务器打补丁。但是,在不停机的情况下给数千台服务器打补丁,并不容易。

  在本月初举行的LinuxPlumbers大会(仅限受邀参加的顶级Linux内核开发人员会议)上,MetaLinux内核工程师BrenoLeitao解释了Facebook是如何在全球数百万台服务器上实现这一目标的。

  Leitao表示,如果使用普通技术,将一个新内核推广到所有机器上至少需要45天的时间。正如他所说,“排空和反排空主机是很困难的。”这是确定无疑的。

  如果只是一个小的更新,那可能没问题,但如果是一个安全补丁,那就行不通了。

  因此,Meta使用内核实时补丁(KernelLivePatching,KLP)和RedHat的Kpatch来提供快速补丁。在KLP中,无需重新启动即可将最新的安全更新应用于Linux内核上。这可以最大限度地延长系统的正常运行时间和可用性。

  实时内核补丁

  内核实时补丁以包的形式提供的,该包中包含与主内核包分离的修改代码。补丁是累积的,因此最新的补丁包含了以前内核包的所有补丁。每个内核实时包都与发布它的确切内核版本相关联。

  不过,实时补丁并不能适用于所有情况。不能用于修补数据或结构。另一个问题是,制作一个实时补丁通常需要额外的工程工作。正如Leitao所警告的那样,“这不仅仅是编译实时补丁、知道它是安全的并应用它那么简单。这些都是内核模块,如果不小心的话,可能会破坏内核。不能保证补丁本身就是正确的。”

  Kpatch的工作原理是比较原始内核和打过补丁的内核,然后使用一个定制的内核模块来将新代码打补丁到正在运行的内核中。然后,Kpatch进程使用ftrace监控现有进程的堆栈,以查看是否可以在不产生任何有害影响的情况下制作补丁。

  在安全时,它会将正在运行的代码重定向到已修补过的函数,然后删除现已过时的代码。这样,你的服务器就已经打过补丁了,并且过程没有任何停机时间。

  当然,实际操作起来并没有这么简单。Leitao解释道,“在Meta,当我们应用实时补丁时,通常需要一到两秒的时间才能将补丁应用到主机上。这是针对单个主机的,显然不是针对整个服务器群的,但是与kexec(用于启动新内核的Linux内核机制)相比,主机的这一到两秒已经非常快了。”。它不需要任何的停机时间或工作负载迁移,只需应用实时补丁,就可以开始了。”

  如何给数百万台机器打补丁

  但是,当你谈论的是数以百万计的机器时,这并不是整个故事的全貌。Meta会在补丁发布期间发现缺陷,因此管理员首先会修补候选版本层。因此,当以包滚动方式交付基于RPM的补丁时,也会自动检查服务器的运行状况。

  Meta会检查新内核中的崩溃、主要警报、应用程序及性能问题。这些数据是从各种来源提取的,包括崩溃、netconsole的结果和核心转储。如果错误率超过每千台服务器一次崩溃,则会撤回补丁,并恢复旧内核。

  拥有超过10亿用户的Facebook也在密切关注性能。正如Leitao所说,“实时补丁的性能开销很小,但是当补丁比较热门的函数时,总会有这样的担忧。”

  虽然Meta使用的是Kpatch,但也有其他选择。SUSE提供了kGraft;而Oracle使用的是Ksplice;Canonical则支持Livepatch。不管代码是什么,它们都能提供类似的结果。

  因此,如果你不想让服务器、数据中心和云宕机,可以效仿Meta,使用实时补丁。你会很高兴这么做的。


推荐阅读:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论: