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

    文章

    10816

    浏览量

    210935
  • 服务器
    +关注

    关注

    12

    文章

    8986

    浏览量

    85114
  • 操作系统
    +关注

    关注

    37

    文章

    6707

    浏览量

    123157
  • Linux系统
    +关注

    关注

    4

    文章

    590

    浏览量

    27326
  • SWAP
    +关注

    关注

    0

    文章

    51

    浏览量

    12786
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    深入探讨Linux的进程调度

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

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

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

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

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

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

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

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

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

    DshanMCU-R128s2启动与资源划分

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

    英伟达表示优先考虑日本对GPU的需求

    在东京首相岸田文雄官邸举行的新闻发布会上,黄强调了异常高的市场需求,他表示:“需求非常高,但我向首相保证,我们将尽最大努力优先考虑日本对 GPU 的需求”。
    发表于 12-08 10:37 331次阅读

    Linux是如何对容器下的进程进行CPU限制的,底层是如何工作的?

    现在很多公司的服务都是跑在容器下,我来问几个容器 CPU 相关的问题,看大家对天天在用的技术是否熟悉。
    的头像 发表于 11-29 14:31 1304次阅读
    Linux是如何对<b class='flag-5'>容器</b>下的<b class='flag-5'>进程</b>进行<b class='flag-5'>CPU</b>限制的,底层是如何工作的?

    docker内存不足的解决办法

    内存CPU。通过这个命令,我们可以发现哪个容器占用了大量的内存资源。 调整Docker守护进程
    的头像 发表于 11-23 10:41 2483次阅读

    一种提升存储资源利用率的方法

    和带宽。为了提高云平台中的资源效率,供应商提供可驱逐的虚拟机(即Spot VMs或Harvest VMs)。这些可驱逐的虚拟机允许用户以低优先级使用未分配的资源,也就是说,可驱逐的虚拟机的资源
    的头像 发表于 11-21 10:15 818次阅读
    一种提升存储<b class='flag-5'>资源</b>利用率的方法

    iSulad Sandbox API简化容器调用链

    Kubernetes 的最小编排调度单元 Pod Sandbox 实际上是一个沙箱,为其中的容器提供了资源共享和安全隔离的运行环境。
    的头像 发表于 11-20 17:08 591次阅读
    iSulad Sandbox API简化<b class='flag-5'>容器</b>调用链

    进程进入等待状态有哪几种方式

    文件读写、网络通信等I/O操作时,必须等待I/O设备的响应,进入阻塞等待状态。一旦I/O完成,进程将从阻塞状态恢复到就绪状态。 等待资源:如果进程需要使用某种资源(如共享
    的头像 发表于 11-17 11:19 2053次阅读