性能文章>【译】关于高线程 I/O 密集型 Linux 容器和CPU时间的思考>

【译】关于高线程 I/O 密集型 Linux 容器和CPU时间的思考原创

2年前
386746

理想情况下,运行在 Kubernetes 上的高线程 I/O 密集型 Linux 容器能获得所需的所有CPU时间资源。

但这个肯定不现实。

为了找到答案并优化 Linux 容器,开发人员和 DevOps 团队就必须得了解 Linux 是如何安排任务并为其分配CPU 时间的。

“实时”容器背后的目标是让那个最重要的容器,那个对时间敏感性和可靠性有特殊要求的容器,能与非实时容器一起共享相同的硬件。但在实施此策略之前,先得确定这是否实用,是否可实现。在依赖实时容器的策略中,这些容器资源不足可能会导致性能问题和安全问题。

具有最佳 CPU 时间的实时容器需要多种功能和工具。

这些必备品包括对操作 I/O 请求的访问、实时容器配置文件、支持 CPU 请求的运行时环境以及协作式实时操作系统。 

这些需求可以通过在主机内核中使用实时调度程序来满足,安装与操作系统内核调度程序集成的正确容器运行时引擎版本,然后为每个容器配置参数以处理特殊的 CPU 请求和相关要求。

不幸的是,没有官方支持的解决方案可用。自己开发一个则需要主机提供者、运行时引擎提供者和容器开发人员一起协作,才能生产一个稳定且功能强大的系统。

当然那太遥远。目前,主机提供商对更改 CPU 分配的风险给出了公平的警告。例如,Docker 建议:

“CPU 调度和优先级是高级内核级功能。… 错误地设置这些值可能会导致你的主机系统变得不稳定或无法使用”。 

那我们现在能做什么?最好的选择是遵循当前的默认方法(它需要快速的历史入门)。回顾容器技术的曙光,容器最初没有任何资源限制。在那些沙拉时代,容器可以简单地使用主机的内核调度程序允许的数量。 

这也导致了各种各样的问题,并且容器经常在免费的 CPU 资源上被缩短。解决方法是在 Linux 内核中引入一种新的 CPU 带宽控制机制——完全公平调度器 (CFS)。CFS 集成到 Linux 2.6.23. 中,执行以下职责:

  • CFS 确保 CPU 被公平分配。 
  • 如果提供给不同任务的 CPU 访问时间不平衡,CFS 会为缩短的任务提供它们需要执行的时间。
  • CFS 通过维护虚拟运行时中的 CPU 访问时间来跟踪任务之间的平衡。任务的虚拟运行时间越小,其公认的 CPU 需求就越大。
  • CFS 使用“休眠公平”来确保即使当前未运行的任务在需要时仍能获得其公平份额的 CPU。
  • CFS 不直接使用优先级。

CFS 还维护一个按时间排序的操作的“RB 树”,如下所示:

CFS 树

RB 树上的操作发生在 O(log n) 时间内,所有可运行的任务都按 p->se.yruntime 键排序。CFS 不断地执行 RB 树上最左边的任务,通过任务进行工作,以便每个任务都获得一个轮次并分配 CPU 资源。

大多数当前的 Linux 容器运行时引擎都构建在 cgroup 子系统上,默认情况下在 OS CFS 下使用 CPU 调度程序。重要的是,这意味着在 OS 调度程序中,每个 cgroup 都拥有自己的虚拟运行时子系统。操作系统调度程序给 cgroup 一个轮次,在此期间 cgroup 占用其 CPU 片,然后将轮次传递给下一个虚拟运行时。

因此,有必要考虑 CFS 中的 cgroup,而不是根据处理器数量,而是根据时间片。调整控制调度的 CPU cgroup 子系统可以确保任务获得相对最少的资源,并且还可以对进程任务实施硬性限制,以确保它们使用的资源不会超过供应的资源。

Linux 调度程序在 CFS 调度类期间对 CFS 虚拟运行时的处理如下所示:

时代

不幸的是,使用这些方法来控制对容器的 CPU 分配存在明显的挑战。在 CFS 下,不可能指定更高优先级的任务。I/O 密集型任务需要 I/O 等待和系统调用。因为它们经常将较短的 CPU 份额带入 I/O 等待阶段,然后让步给其他任务,所以 CFS 树倾向于将这些任务向右移动 - 缓慢但肯定会降低它们的优先级。

CFS 树的动态平衡不允许 cgroup 中的任务要求相同的 CPU 使用率。重要的是要了解,当 cgroup 中的任务必然变得空闲时,cgroup 会将其 CPU 份额提供给其他 cgroup 可以借用的剩余 CPU 时间的全局池。同时,CFS 队列中附加的任务共享 CPU 资源也是不可避免的。

因此,在 CFS 下创建一个完整的实时容器是不可能的。但是,可以创建一个“软实时容器”,在其 CPU 分配在截止日期后降级之前捕获额外的 CPU 并获得可靠的结果。

为了满足高线程 I/O 密集型容器应用程序的需求,开发团队必须彻底了解 CFS 如何平衡 RB 树以及 如何优化关键任务保留在 RB 树最左侧节点中的机会。利用 Kubernetes CPU 管理器——它提供额外的 POD 管理并利用 CFS 机制——也很聪明。

请记住,每项任务的细节对哪些优化技术最有效有巨大影响。开发人员团队必须试验并仔细观察产生的行为,以在 Linux 上实现软实时容器,从而成功满足其应用程序的需求。

点赞收藏
金色梦想

终身学习。

请先登录,查看4条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

API性能调优
6
4