Uber的20万容器实践:如何避免容器化环境中的 CPU 节流

uber的20万容器实践:如何避免容器化环境中的 cpu 节流在 uber,所有的有状态工作负载都在一个跨大型主机的通用容器化平台上运行。这些工作负载包括 mysql®、apache cassandra®、elasticsearch®、apache kafka®、apache hdfs™、redis™、docstore、schemaless 等,许多情况下,这些工作负载位于同一物理主机上。

通过 65,000 个物理主机、240 万个内核和 200,000 个容器,提高利用率以降低成本是一项持续且重要的任务。然而,最近由于 CPU 限流,利用率提升变得不那么顺利。

事实证明,问题在于 Linux 内核如何为进程分配运行时间。在本文中,我们将描述从 CPU 配额切换到 cpusets(也称为 CPU pinning),如何使我们能够以轻微增加 P50 延迟的代价换取显著降低 P99 延迟。由于资源需求变化较小,这反过来又使我们能够将整个集群范围内的核心分配减少 11%。

Cgroups、配额和 CpusetsCPU 配额和 cpusets 是 Linux 内核的调度器功能。Linux 内核通过 cgroups 实现资源隔离,所有容器平台均以此为基础。通常,一个容器映射到一个 cgroup,它控制着在容器中运行的任何进程的资源。

有两种类型的 cgroup(Linux 术语中的控制器)用于执行 CPU 隔离:CPU 和 cpuset。它们都控制允许一组进程使用多少 CPU,但通过两种不同的方式:分别通过 CPU 时间配额和 CPU pinning。

CPU 配额CPU 控制器使用配额来实现隔离。对于一个 CPU 集,你指定要允许的 CPU 比例(核心)。使用以下公式将其转换为给定时间段(通常为 100 毫秒)的配额:

配额 = core_count 周期(quota = core_count period)

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流在上面的例子中,有一个需要 2 个内核的容器,这相当于每周期需要 200 毫秒的 CPU 时间。

CPU 配额和节流由于容器内的多处理/线程,这种方法被证明是有问题的。这会使容器过快地用完配额,导致它在剩余时间段内受到限制。如下图所示:

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流对于提供低延迟请求的容器来说,这是个问题。突然间,由于节流,通常需要几毫秒才能完成的请求可能需要超过 100 毫秒。

简单的解决方法是为进程分配更多的 CPU 时间。虽然这很有效,但在规模上也很昂贵。另一种解决方案是根本不使用隔离。然而,这对于同一地点的工作负载来说是一个非常糟糕的主意,因为一个进程可能会完全耗尽其他进程。

使用 Cpusets 避免节流cpuset 控制器使用 CPU pinning 而不是配额——它基本上限制了一个容器可以在哪些内核上运行。这意味着有可能将所有容器分布在不同的核上,以便每个核只服务于一个容器。这样就实现了完全隔离,不再需要配额或节流,换句话说,可以用延迟的一致性和更繁琐的核管理,来与处理突发和简单配置进行妥协。上面的例子看起来像这样:

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流两个容器在两组不同的内核上运行。它们被允许在这些核心上尽可能地使用,但不能使用未分配的核心。

这样做的结果是 P99 的延迟变得更加稳定。下面是一个在启用 cpuset 时对生产数据库集群(每一行是一个容器)进行节流的例子。正如预期的那样,所有节流都消失了:

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流节流现象消失了,因为容器能够自由使用所有分配的内核。更有趣的是,由于容器能够以稳定的速率处理请求,P99 的延迟也得到了改善。在这种情况下,由于消除了严重的节流,延迟下降了50%左右。

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流值得注意的是,使用 cpusets 也有负面影响。特别是,P50 延迟通常会增加一点,因为它不再可能突入未分配的核心。结果 P50 和 P99 的延迟变得更接近,这通常是可取的。这点将在本文末尾进行更多讨论。

分配 CPU为了使用 cpusets,容器必须绑定到核心。正确分配内核需要一些关于现代 CPU 架构如何工作的背景知识,因为错误的分配会导致性能显著下降。

CPU 通常围绕以下结构构建:

Calliper 文档对比神器 Calliper 文档对比神器

文档内容对比神器

Calliper 文档对比神器 28 查看详情 Calliper 文档对比神器

一台物理机可以有多个 CPU 插槽每个插座都有独立的L3缓存每个 CPU 有多个核心每个核心都有独立的 L2/L1 缓存每个核心都可以有超线程超线程通常被视为核心,但分配 2 个超线程而不是 1 个可能只会将性能提高 1.3 倍所有这些都意味着选择正确的内核实际上很重要。最后一个问题是编号不是连续的,有时甚至不是确定性的——例如,拓扑可能如下所示:

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流在这种情况下,一个容器被安排在物理套接字和不同的内核上,这会导致性能下降——我们已经看到由于错误的套接字分配,P99 延迟降低了多达 500%。为了处理这个问题,调度器必须从内核收集确切的硬件拓扑,并使用它来分配内核。原始信息在 /proc/cpuinfo 中找到:

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流利用这些信息,我们可以分配物理上相互接近的核心:

Uber的20万容器实践:如何避免容器化环境中的 CPU 节流缺点和局限性虽然 cpusets 解决了大部分延迟的问题,但也存在一些限制和权衡:

无法分配小数核心。这对于数据库进程来说不是问题,因为它们往往很大,因此向上或向下舍入不是问题。但是,这确实意味着容器的数量不能大于内核的数量,这对于某些工作负载来说是有问题的。

系统范围的进程仍然可以窃取时间。例如,通过 systemd、kernel workers 等在宿主机上运行的服务,仍然需要在某个地方运行。理论上也可以将它们分配给一组有限的内核,但这可能很棘手,因为它们需要的时间与系统负载成正比。一种解决方法是在容器子集上使用实时进程调度——后文会介绍这一点。

需要进行碎片整理。随着时间的推移,可用内核将变得碎片化,并且需要移动进程以创建连续的可用内核块。这可以在线完成,但是从一个物理套接字移动到另一个将意味着内存访问突然变得远程。这也可以缓解,另一篇文章会介绍。

没有突发限制。有时你可能希望使用主机上未分配的资源来加速正在运行的容器。在这篇文章中,我们讨论了独占的 cpusets,但可以将同一个核心分配给多个容器(即 cgroups),也可以将 cpusets 与配额结合使用,这允许突破限制。

结论切换到有状态工作负载的 cpusets 是 Uber 的一项重大改进。它使我们能够实现更稳定的数据库级别的延迟,并且通过减少过度配置以处理由于节流导致的峰值,节省了大约 11% 的内核。由于没有突发限制,相同大小的容器现在在主机之间的表现是一样的,这也导致了更稳定的性能。

Uber 的有状态部署平台是内部开发的,但 Kubernetes ® 也通过使用静态策略来支持 cpusets。

有关 Uber 如何测试配额和 cpusets 的细节,见附录。

引用链接

原文链接: https://www.php.cn/link/73a3d9df0329c89f402ea26d5fd86da8

文章链接: https://www.php.cn/link/cd53dd33e57a598301a7c1c07e35a8d6

链接: https://www.php.cn/link/37b47bc2fe01ddcb1c4673a4419c7e13

附录: https://www.php.cn/link/07246f1add4748b2c3c031e2ec9262e0

以上就是Uber的20万容器实践:如何避免容器化环境中的 CPU 节流的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/299545.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
《生态品牌发展报告(2025)》发布,生态品牌范式成全球企业进化“风向标”
上一篇 2026年10月24日 09:32:48
Go语言空结构体:实现无状态接口与内存优化的实践指南
下一篇 2025年12月16日 01:52:45

相关推荐

  • 《生态品牌发展报告(2025)》发布,生态品牌范式成全球企业进化“风向标”

    《生态品牌发展报告(2025)》发布,生态品牌范式成全球企业进化“风向标”《生态品牌发展报告(2025)》发布,生态品牌范式成全球企业进化“风向标”《生态品牌发展报告(2025)》发布,生态品牌范式成全球企业进化“风向标”《生态品牌发展报告(2025)》发布,生态品牌范式成全球企业进化“风向标”

    10月31日,2025年第四届生态品牌认证颁奖典礼在北京隆重举行,来自学术界与企业界的800位重磅嘉宾齐聚一堂,共同探讨生态品牌如何驱动高质量发展的新路径。活动现场,新华社品牌工作办公室、新华出版社、凯度集团、《财经》杂志及牛津大学赛德商学院联合发布《生态品牌发展报告(2025)》,并揭晓了本届生态…

    2026年10月24日 • 用户投稿
    000
  • GraphQL Spring Boot Client:处理对象列表的查询

    GraphQL Spring Boot Client:处理对象列表的查询GraphQL Spring Boot Client:处理对象列表的查询GraphQL Spring Boot Client:处理对象列表的查询GraphQL Spring Boot Client:处理对象列表的查询

    本文档旨在指导开发者如何在 Spring Boot GraphQL 客户端中传递对象列表进行查询。我们将探讨如何构建 GraphQL 查询,并使用 `GraphQLTemplate` 发送包含对象列表的请求。通过本文,你将学会如何有效地与 GraphQL 服务交互,并获取所需的数据。 在使用 Spr…

    2026年10月24日 • 用户投稿
    100
  • Switch2底座故障引发用户不满 多方渠道出现售后难题

    Switch2底座故障引发用户不满 多方渠道出现售后难题Switch2底座故障引发用户不满 多方渠道出现售后难题Switch2底座故障引发用户不满 多方渠道出现售后难题Switch2底座故障引发用户不满 多方渠道出现售后难题

    近日,一位玩家分享了自己入手switch 2不到一周便遇到底座故障,并前往零售商申请售后维修却被拒的经历。这一遭遇引发了首发玩家群体对switch 2频发问题及售后服务混乱的广泛不满。 自任天堂Switch 2发布以来,有关其底座故障的问题逐渐浮出水面,引起用户担忧。多位消费者反馈,在购入新机短短数…

    2026年10月24日 • 用户投稿
    000
  • VSCode如何集成Postman API测试 VSCode Postman插件的使用指南

    VSCode如何集成Postman API测试 VSCode Postman插件的使用指南VSCode如何集成Postman API测试 VSCode Postman插件的使用指南VSCode如何集成Postman API测试 VSCode Postman插件的使用指南VSCode如何集成Postman API测试 VSCode Postman插件的使用指南

    vscode集成postman api测试的核心是通过插件和newman实现高效测试。1. 安装newman:使用npm install -g newman安装postman的命令行工具,以便在终端运行postman集合。2. 安装rest client插件:在vscode中安装“rest clie…

    2026年10月24日 • 用户投稿
    100
  • 如何在mysql中查看SQL执行日志

    如何在mysql中查看SQL执行日志如何在mysql中查看SQL执行日志如何在mysql中查看SQL执行日志如何在mysql中查看SQL执行日志

    开启MySQL SQL执行日志需配置通用查询日志或慢查询日志。1. 通用日志记录所有SQL,通过SET GLOBAL general_log = ON启用,可输出至文件或表;2. 慢查询日志用于捕获执行时间超过阈值的SQL,通过SET GLOBAL slow_query_log = ON和long_…

    2026年10月24日 • 用户投稿
    400
  • Spring Boot GraphQL 客户端:传递对象列表的完整指南

    Spring Boot GraphQL 客户端:传递对象列表的完整指南Spring Boot GraphQL 客户端:传递对象列表的完整指南Spring Boot GraphQL 客户端:传递对象列表的完整指南Spring Boot GraphQL 客户端:传递对象列表的完整指南

    本文档旨在指导开发者如何在 Spring Boot GraphQL 客户端中传递对象列表。我们将探讨如何构建 GraphQL 查询,并使用 `GraphQLTemplate` 发送包含对象列表的请求,从而实现高效的数据交互。 在构建微服务架构时,GraphQL 作为一种强大的 API 查询语言,被广…

    2026年10月24日 • 用户投稿
    300
  • 即梦的收费标准是什么_即梦收费标准解析

    即梦的收费标准是什么_即梦收费标准解析即梦的收费标准是什么_即梦收费标准解析即梦的收费标准是什么_即梦收费标准解析即梦的收费标准是什么_即梦收费标准解析

    即梦AI提供免费与付费服务。免费用户通过任务获取积分使用基础功能;付费会员约69元/月,享快速生成、高清2K、无右下角水印及Pro视频等专属权益。包年会员约55元/月,性价比更高。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 即梦AI 一…

    2026年10月24日 • 用户投稿
    100
  • 《忍者龙剑传4》实测 耕升 RTX 5060 Ti 16GB踏雪X3 OC开启新忍者之路

    《忍者龙剑传4》实测 耕升 RTX 5060 Ti 16GB踏雪X3 OC开启新忍者之路《忍者龙剑传4》实测 耕升 RTX 5060 Ti 16GB踏雪X3 OC开启新忍者之路《忍者龙剑传4》实测 耕升 RTX 5060 Ti 16GB踏雪X3 OC开启新忍者之路《忍者龙剑传4》实测 耕升 RTX 5060 Ti 16GB踏雪X3 OC开启新忍者之路

    《忍者龙剑传4》是忍者组(team ninja)与白金工作室联合研发,由xbox game studios publishing负责发行的一款忍者题材act冒险游戏,是系列自2012年《忍者龙剑传3》后沉寂13年的正统续作。本作对难度设计、战斗系统、画面等地方进行了全方位的革新,同时依然保留了系列标…

    2026年10月24日 • 用户投稿
    100
  • 如何设置Linux网络桥接 虚拟网络桥接配置步骤

    如何设置Linux网络桥接 虚拟网络桥接配置步骤如何设置Linux网络桥接 虚拟网络桥接配置步骤如何设置Linux网络桥接 虚拟网络桥接配置步骤如何设置Linux网络桥接 虚拟网络桥接配置步骤

    网络桥接是将物理网卡与虚拟接口绑定,使虚拟机或容器能直接接入局域网。1. 安装bridge-utils工具;2. 查看并选择物理网卡如eth0;3. 创建桥接接口br0并添加物理网卡;4. 将ip地址分配给br0并启用接口;5. 修改配置文件实现持久化设置;6. 注意ip冲突、防火墙规则及无线网卡不…

    2026年10月24日 • 用户投稿
    100
  • JDK和JRE有什么区别 Java开发环境该如何正确安装

    安装JDK即可拥有完整Java开发环境,因其包含JRE及开发工具。开发者需下载LTS版本JDK,配置JAVA_HOME与PATH环境变量,并通过java -version和javac -version验证安装,最后以HelloWorld程序测试编译运行功能。 JDK 和 JRE 是 Java 开发和…

    2026年10月24日
    000
  • 捷途山海L7 PLUS将于明日开启预售!定位中型SUV

    8月18日,捷途汽车将迎来第八届粉丝文化节,届时备受关注的捷途山海l7 plus将正式启动预售,并计划于8月底在成都车展正式上市。 据了解,捷途山海L7 PLUS定位于中型SUV,相比现款山海L7车身尺寸进一步升级,提供5座与7座两种布局可选。车内配置主打“冰柜、彩电、大床房”理念,致力于打造移动生…

    2026年10月24日
    000
  • pymysql使用指南

    pymysql使用指南pymysql使用指南pymysql使用指南pymysql使用指南

    1 引言 mysql应该说是如今使用最为普遍的数据库了,没有之一,而python作为最为流行的语言之一,自然少不了与mysql打交道,pymysql就是使用最多的工具库了。 2 创建库、表 我们先从创建数据库、数据表说起,有了库表,后面的增删改查才有根据。 2.1 创建数据库 pymysql的所有对…

    2026年10月24日 • 用户投稿
    400
  • mysql数据库设计时范式和反范式如何选择

    mysql数据库设计时范式和反范式如何选择mysql数据库设计时范式和反范式如何选择mysql数据库设计时范式和反范式如何选择mysql数据库设计时范式和反范式如何选择

    范式化减少冗余、保证一致性,适合写多且一致性要求高的场景;反范式提升查询性能,适合读多写少的分析型系统;实际设计中常采用折中策略,在核心业务保持范式化的同时对关键查询路径适度反范式,并结合缓存或物化视图优化性能。 数据库设计中,范式和反范式的选择本质上是数据一致性与查询性能之间的权衡。选择哪种方式,…

    2026年10月24日 • 用户投稿
    000
  • AI写真小程序在线试用 AI写真创意生成入口

    AI写真小程序在线试用 AI写真创意生成入口AI写真小程序在线试用 AI写真创意生成入口AI写真小程序在线试用 AI写真创意生成入口AI写真小程序在线试用 AI写真创意生成入口

    AI写真小程序在线试用入口为:https://ai.sohu.com/pc/generate/byPortraitImg?_trans_=030001_jdaixz,用户无需注册,上传照片后可选择职场风、古风、未来科技风等多种模板生成艺术写真,支持电脑端与手机小程序多端同步使用。 ☞☞☞AI 智能聊…

    2026年10月24日 • 用户投稿
    000
  • VSCode如何实现AI代码安全扫描 VSCode集成智能漏洞检测系统

    VSCode如何实现AI代码安全扫描 VSCode集成智能漏洞检测系统VSCode如何实现AI代码安全扫描 VSCode集成智能漏洞检测系统VSCode如何实现AI代码安全扫描 VSCode集成智能漏洞检测系统VSCode如何实现AI代码安全扫描 VSCode集成智能漏洞检测系统

    选择适合vscode的ai代码安全扫描插件需考虑以下几点:1. 插件支持的编程语言是否覆盖常用语言;2. 是否具备识别sql注入、xss等常见漏洞的能力;3. 扫描性能是否高效,不影响开发效率;4. 配置是否简便,报告是否清晰易懂。主流插件包括sonarlint、snyk vulnerability…

    2026年10月24日 • 用户投稿
    000
  • Linux下通过grep查找指定的进程并杀死

    Linux下通过grep查找指定的进程并杀死Linux下通过grep查找指定的进程并杀死Linux下通过grep查找指定的进程并杀死Linux下通过grep查找指定的进程并杀死

    一、功能简介 linux系统通过命令行查找特定的进程并自动终止其运行。 二、执行命令 2.1 命令行执行 代码语言:javascript代码运行次数:0 运行复制 ps -ef | grep s_app | grep -v grep | awk ‘{print $2}’ | xargs kill -…

    2026年10月24日 • 用户投稿
    100
  • 在Java/Android中评估包含数学符号的字符串表达式

    在Java/Android中评估包含数学符号的字符串表达式在Java/Android中评估包含数学符号的字符串表达式在Java/Android中评估包含数学符号的字符串表达式在Java/Android中评估包含数学符号的字符串表达式

    本文详细阐述了如何在java/android环境中,利用mozilla rhino javascript引擎将包含加减乘除等数学符号的字符串表达式(如“5+5”)转换为可计算的数值类型。通过集成rhino库,开发者可以安全有效地对字符串形式的数学表达式进行求值,并获取精确的整数或浮点数结果,从而解决…

    2026年10月24日 • 用户投稿
    000
  • 小米马志宇警告存储涨价:明年最新的成本预估“有点惊悚”

    小米马志宇警告存储涨价:明年最新的成本预估“有点惊悚”小米马志宇警告存储涨价:明年最新的成本预估“有点惊悚”小米马志宇警告存储涨价:明年最新的成本预估“有点惊悚”小米马志宇警告存储涨价:明年最新的成本预估“有点惊悚”

    11 月 4 日消息,关于存储芯片涨价的传闻早已在市场上发酵。据《韩国经济新闻》在2025年10月的报道,业内知情人士透露,三星、sk海力士等核心存储原厂已正式通知客户,计划于2025年第四季度将dram与nand闪存的合约价格上调最高达30%。 面对这一趋势,小米通讯技术有限公司产品行销总监马志宇…

    2026年10月24日 • 用户投稿
    100
  • 如何在mysql中设置客户端连接超时

    如何在mysql中设置客户端连接超时如何在mysql中设置客户端连接超时如何在mysql中设置客户端连接超时如何在mysql中设置客户端连接超时

    答案是通过设置MySQL服务端的wait_timeout和interactive_timeout参数来控制客户端连接超时。首先,wait_timeout用于非交互式连接,默认28800秒,可设为600实现10分钟空闲断开;其次,interactive_timeout针对交互式连接如命令行登录,建议与…

    2026年10月24日 • 用户投稿
    600
  • VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南

    VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南

    要在vscode中进行java开发,首先要安装jdk并配置java_home和path环境变量,确保java -version和javac -version命令能正确输出版本信息;2. 然后在vscode中安装“java extension pack”扩展包,该扩展会自动识别系统jdk并提供语言支持…

    2026年10月24日 • 用户投稿
    600

发表回复

登录后才能评论
关注微信