0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

容器进程调度时是该优先考虑CPU资源还是内存资源

冬至配饺子 来源:开发内功修炼 作者:张彦飞allen 2022-08-16 18:20 次阅读

问题是这样的:有 A B 两台服务器,其中 A 服务器 cpu 快满了,内存很空闲。另外一台 B 服务器 cpu 很空闲,但内存快满了。现在 k8s 有一个新的任务要调度,请问应该选择哪台服务器?这其实是现在非常火的 k8s 的经典应用场景。

有的同学看到这个问题后的第一个想法是应该先评估一下新任务是计算密集型的业务还是 io 密集型的。然后再决定往哪个机器上调度。这么思考倒是也不能算错,只不过是没有抓到问题的关键点上。

这个问题的关键点是在于要思考一下调度到某个机器上可能会出现什么问题。

1. 调度到 CPU 比较满的 A 服务器

假设我们调度到 CPU 比较满的 A 机器上会出现什么状况呢?因为 CPU 资源是分时来调度的,每个进程都会得到一些时间片进行执行。所以 A 机器上不管 CPU 有多忙,再加一个的进程来运行话其实影响无非就是所有的进程都运行的更慢了一些。再换个说法,就是 CPU 资源是可以超卖的,是属于可压缩资源。

这里提一下,部分读者反馈说自己的云虚机在 CPU 飙升到 100% 的时候,云厂商为了保护主机,直接宕机。这种情况在各大公司的 IDC 机房内不太可能出现,所以这种情况咱们暂时不考虑。

2. 调度到内存比较满的 B 服务器

再假设我们调度到内存比较满的 B 机器上会出现什么状况呢?不知道你有没有遭遇过线上进程被 oom kill 掉的场景。这种情况下就是当机器物理内存不是很充足的时候,如果申请的内存过大,操作系统就可能会挑选在运行的一些进程将其杀掉。

这里稍微展开说一下,操作系统选择要杀掉的进程也不一定是内存消耗最多的服务。而是会综合内存消耗和进程的 oom_score_adj(可配置) 值来进行选择。在一些在离线混部的服务器上,往往会将在线服务进程的被杀的优先级调的低一些,离线服务进程的被杀优先级调高。这样充分保障在线服务的稳定运行。

先不考虑在离线混部的情况,假设都是在线服务,那么无论哪一个服务的进程被 Linux 给 oom kill掉影响都是非常大的。还得重新调度,而且还有可能影响服务的稳定性,以及接口的正确返回。

这里有的同学可能会说,Linux 上不是支持将内存 swap 到磁盘上吗?但其实在线上服务器中,由于磁盘的性能比内存低太多了,所以大部分的线上服务器都不会开启 swap 这个特性。因为服务的内存一旦被 swap 到内存,即使是能运行,性能也会有急剧的下降。所以一般不怎么会开启。

结论

所以对比来看,新任务在调度的时候应该优先选择 A 服务器,因为它的空闲内存比较多,不太可能出现进程被杀死的情况。虽然它的 CPU 比较满,但所有的服务仍然可以运行。

在实际中,k8s 的 API Server接受客户端提交Pod对象创建请求后的操作过程中,有一个重要的步骤就是由调度器程序kube-scheduler从当前集群中选择一个可用的最佳节点来接收并运行它。

当然实际中 k8s 的调度策略不是这么简单的,系统默认的 kube-scheduler 调度器外还有直接指定Node主机名、节点亲和性、Pod亲和性、nodeSelector 等等调度策略。

就单拿系统默认的 kube-scheduler 调度器来说的话,还会综合考虑单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等这些因素对可调度节点打分,然后选出其中得分最高的 Node 来运行 Pod。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10850

    浏览量

    211518
  • 服务器
    +关注

    关注

    12

    文章

    9109

    浏览量

    85310
  • 操作系统
    +关注

    关注

    37

    文章

    6794

    浏览量

    123275
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27387
  • SWAP
    +关注

    关注

    0

    文章

    51

    浏览量

    12820
收藏 人收藏

    评论

    相关推荐

    深入解析Linux程序与进程

    关于某个数据集合的一次运行活动。作为系统进行资源分配和调度的基本单位,是操作系统结构的基础。 程序与进程的关系 进程的状态 基础进程状态 创
    的头像 发表于 12-18 11:01 46次阅读
    深入解析Linux程序与<b class='flag-5'>进程</b>

    Linux之CPU调度策略和CPU亲和性

    决定在某一时间点上哪个进程在运行。调度器必须平衡几个选项: 快速决定下一个运行的进程 进程可以公平的活动
    的头像 发表于 12-05 16:38 351次阅读
    Linux之<b class='flag-5'>CPU</b><b class='flag-5'>调度</b>策略和<b class='flag-5'>CPU</b>亲和性

    虚拟内存溢出怎么处理 虚拟内存在服务器中的应用

    在现代计算机系统中,虚拟内存是一种重要的资源管理技术,它允许系统使用硬盘空间来扩展物理内存的容量。然而,当系统运行的程序和进程超出了物理内存
    的头像 发表于 12-04 09:49 131次阅读

    一文搞懂Linux进程的睡眠和唤醒

    的代码和数据,进而去执行这个进程。下面列举了一些进程状态: 注意:没有+时,默认是后台进程 进程调度
    发表于 11-04 15:15

    如何限制容器可以使用的CPU资源

    默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使
    的头像 发表于 10-24 17:04 213次阅读
    如何限制<b class='flag-5'>容器</b>可以使用的<b class='flag-5'>CPU</b><b class='flag-5'>资源</b>

    android系统使用appe播放audio资源,相关进程被kill之后appe无法再次打开的原因?

    android系统使用appe播放audio资源,相关进程被kill之后appe无法再次打开,原因是appe资源被占用。 在Ti提供的demo中,通过 signal(SIGKILL
    发表于 10-23 07:56

    云服务器的购买资源和扩容资源的区别和联系

    服务商处直接购买一定量的计算资源,如CPU内存或存储空间等。而扩容资源则是指在现有的云服务器基础上增加额外的资源
    的头像 发表于 10-18 11:21 192次阅读

    深入探讨Linux的进程调度

    Linux操作系统作为一个开源且广泛应用的操作系统,其内核设计包含了许多核心功能,而进程调度器(Scheduler)就是其中一个至关重要的模块。进程调度器负责决定在任何给定的时刻哪个
    的头像 发表于 08-13 13:36 935次阅读
    深入探讨Linux的<b class='flag-5'>进程</b><b class='flag-5'>调度</b>器

    鸿蒙开发接口资源调度:【@ohos.workScheduler (延迟任务调度)】

    开发者在开发应用时,通过调用延迟任务注册接口,注册对实时性要求不高的延迟任务,任务默认由系统安排,在系统空闲时根据性能、功耗、热等情况进行调度执行。
    的头像 发表于 06-04 10:01 895次阅读
    鸿蒙开发接口<b class='flag-5'>资源</b><b class='flag-5'>调度</b>:【@ohos.workScheduler (延迟任务<b class='flag-5'>调度</b>)】

    HarmonyOS跨进程通信—IPC与RPC通信开发

    使用Binder驱动,用于设备内的跨进程通信,后者使用软总线驱动,用于跨设备跨进程通信。需要跨进程通信的原因是因为每个进程都有自己独立的资源
    的头像 发表于 02-02 17:47 1270次阅读
    HarmonyOS跨<b class='flag-5'>进程</b>通信—IPC与RPC通信开发

    线程是什么的基本单位 进程与线程的本质区别

    线程是操作系统中处理器调度的基本单位,它代表着独立的执行流。在一个进程中,可以包含多个线程,这些线程共享相同的进程资源,如内存空间、文件描述
    的头像 发表于 02-02 16:30 917次阅读

    鸿蒙原生应用/元服务开发-延迟任务说明(一)

    WORK_SCHEDULER资源,扩展单次回调运行时长,扩展后在充电状态下为20分钟,非充电状态下为10分钟。 调度延迟:系统会根据内存、功耗、设备温度、用户使用习惯等统一调度,如当系
    发表于 01-16 14:57

    线程、进程、多线程、多进程和多任务之间有何关系?

    进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源CPU时间、内存
    的头像 发表于 01-11 13:39 356次阅读
    线程、<b class='flag-5'>进程</b>、多线程、多<b class='flag-5'>进程</b>和多任务之间有何关系?

    mcu线程和进程的区别是什么

    是程序执行的基本单位,它是进程中的一个实体,是进程内的一条执行路径。线程是CPU调度的最小单位,它可以看作是轻量级的进程,不拥有独立的地址空
    的头像 发表于 01-04 10:45 740次阅读

    DshanMCU-R128s2启动与资源划分

    固件、协议栈、驱动、休眠唤醒、安全启动、安全控制 C906 应用核。运行大部分驱动与主要应用,控制台 HIFI5 算法核。运行音频相关驱动与算法 内存配置 R128 方案目前三个核 OS 运行的地址范围如下表。 这只是默认配置方案,CPU
    的头像 发表于 12-22 17:46 654次阅读
    DshanMCU-R128s2启动与<b class='flag-5'>资源</b>划分