个人网站建设的参考文献,做淘客网站怎么建要购买数据库吗,网站开发的工作对象,广东建设厅的网站查询大家好#xff0c;我是飞哥#xff01;前几天看到一个有意思的问题#xff0c;我前几天在朋友圈分享了#xff0c;今天再在公众号里给大家发一下。问题是这样的#xff1a;有 A B 两台服务器#xff0c;其中 A 服务器 cpu 快满了#xff0c;内存很空闲。另外一台 B 服务…大家好我是飞哥前几天看到一个有意思的问题我前几天在朋友圈分享了今天再在公众号里给大家发一下。问题是这样的有 A B 两台服务器其中 A 服务器 cpu 快满了内存很空闲。另外一台 B 服务器 cpu 很空闲但内存快满了。现在 k8s 有一个新的任务要调度请问应该选择哪台服务器这其实是现在非常火的 k8s 的经典应用场景。有的同学看到这个问题后的第一个想法是应该先评估一下新任务是计算密集型的业务还是 io 密集型的。然后再决定往哪个机器上调度。这么思考倒是也不能算错只不过是没有抓到问题的关键点上。这个问题的关键点是在于要思考一下调度到某个机器上可能会出现什么问题。调度到 CPU 比较满的 A 服务器假设我们调度到 CPU 比较满的 A 机器上会出现什么状况呢因为 CPU 资源是分时来调度的每个进程都会得到一些时间片进行执行。所以 A 机器上不管 CPU 有多忙再加一个的进程来运行话其实影响无非就是所有的进程都运行的更慢了一些。再换个说法就是 CPU 资源是可以超卖的是属于可压缩资源。这里提一下部分读者反馈说自己的云虚机在 CPU 飙升到 100% 的时候云厂商为了保护主机直接宕机。这种情况在各大公司的 IDC 机房内不太可能出现所以这种情况咱们暂时不考虑。调度到内存比较满的 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。另外最后再贴一位回答非常认真的读者的答案也非常的有参考价值。最后欢迎大家的点赞和在看。