看到一篇文章,大概给总结了下,代码就不贴了。
现在很多服务器都是多核服务器了,Linux操作系统会自动把任务分配到不同的处理器上,并尽可能的保持负载均衡。
linux多核cpu上负载均衡两个问题:
1. 何时检查并调整负载情况?
2. 如何调整负载?
第一个问题,可以定时调整负载,这种方法虽然简单,但不高效。实际上,2.6.20版linux kernel的确使用软中断来定时调整多CPU上的压力(调用函数run_rebalance_domains),每秒1次。每秒1次还不够,kernel需要紧跟进程的变化来调整,所以内核在进程睡眠和醒来这两个时间点检查CPU们的负载。
第二个问题,调整负载的策略就是将任务从最繁忙的cpu上迁移到空闲的cpu上。linux在实现上更多的考虑了cpu的结构。多核处理器都是片上多核,然后有多个处理器。就是一个chip上有多个cpu,即片上多核。同一个chip上的cpu共享L2高速缓存。所以linux为了在调整负载时继续利用缓存,也就为了避免缓存失效,尽量在一个chip内迁移进程。
SMP负载均衡检查或调整在两个内核函数里发生:
1. schedule()。当进程调用了sleep、usleep、poll、epoll、pause时,也就是调用了可能睡去的操作时都会转为内核代码里对schedule()函数的调用。
2. try_to_wake_up() 。说白了就是进程刚才睡了,现在要醒来,那醒来以后跑在哪个CPU上呢?这个选择CPU的过程,也就是负载均衡的过程。
具体的实现就是针对当前CPU所属的每个domain(从子到父),找到该sched_domain里最忙的sched_group,再从该group里找出最忙的运行队列,最后从该“最忙”运行队列里挑出几个进程到当前CPU的运行队列里。顺序就是core cpu->processor从子到父的顺序。
具体迁移多少进程也是有限制的,这个就可以不用太关注了。

本文探讨Linux操作系统如何在多核处理器上实现负载均衡,包括何时检查和调整负载,以及如何有效地迁移任务以保持平衡。Linux通过schedule()和try_to_wake_up()函数,在进程睡眠和唤醒时进行负载调整,尽量在同一芯片内迁移进程以利用缓存。负载均衡确保了处理器资源的公平分配,避免了繁忙或闲置的状态长时间维持。
最低0.47元/天 解锁文章
1453

被折叠的 条评论
为什么被折叠?



