linux多核处理器上的负载均衡原理

来源:互联网 发布:个人seo 编辑:程序博客网 时间:2024/04/19 12:01

看到一篇文章,大概给总结了下,代码就不贴了。

 

现在很多服务器都是多核服务器了,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从子到父的顺序。

具体迁移多少进程也是有限制的,这个就可以不用太关注了。

 

系统里总有闲的CPU(哪怕是相对比较闲),它总会执行schedule(),就算它从不调用sleep从不睡眠,时钟中断也会迫使其进程切换,进而调用schedule,进而将繁忙CPU的任务揽一部分到自己身上。这样,谁最闲,谁早晚会从忙人身上揽活儿过来,所以忙人不会永远最忙,闲人也不会永远最闲,所以就平等,就均衡了。

 

详细可以参考链接

http://www.ibm.com/developerworks/cn/linux/l-cn-schldom/index.html

http://rdc.taobao.com/blog/cs/?p=379

 

其实这个实现策略因为考虑了硬件上性能和特点,这样实现简单而且效率比较好。关于分布式系统的负载均衡技术还需要多关注。

 

原创粉丝点击