“linux内核SMP负载均衡浅析”一篇

linux内核SMP负载均衡浅析

实时进程的负载均衡

这里有句话,“‘每个CPU去竞争每一个run_queue’比‘每个CPU去竞争一个总的run_queue’略微好一些”。这两种策略之间的区别,显然是多服务台和单服务台的区别,在银行拍过队人的根据经验就能判断。

乍看之下,这种top-N的筛选对调度程序该是费时费力的,不过考虑常见的片上SMP系统的N都是个位数,貌似可以接受。

普通进程的负载均衡

update_cpu_load确实有趣,this_rq->cpu_load[i]的每一项都保存了历史上run_queue load值的加权滑动平均值(weighted moving average),不同的均值之间的差异在于其权重。这里面的数学原理也简单,一个load值序列与函数f(k)=(1-2^i)^(-k)的卷积。巧妙地是这短短几行代码就做了这件事。

调度域

这里引出了一个概念,SMT(Simultaneous multithreading)同时多线程。目前来看,这是种依赖硬件实现的技术,不过在调度软件看来,跟SMP一样的效果。

再有就是“迁移线程”的概念,分布式执行的回调函数要比集中调度好一些?

后记:Linux2.6内核加入的诸多对多处理器以及多线程的新的支持特性给人印象深刻。各种层次并行技术涉及的面非常广,从mpp(Massively Parallel Processing)到tlp(Thread-Level Parallel)内容庞杂。这篇文章提供了窥探并行系统内部逻辑的机会,值得一读。

猜你喜欢

转载自geekish.iteye.com/blog/1173059