看到一篇文章,大概给总结了下,代码就不贴了。
现在很多服务器都是多核服务器了,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的过程,也就是负载均衡的过程。
具体的实现就是针对当前