Linux多核处理器性能优化与调试指南(上)
1. 多核处理器概述
多核CPU如今已广泛应用于多种架构。为简化讨论,主要关注AMD和Intel基于英特尔架构的实现,不过相关问题适用于所有架构。
第一代Intel和AMD的多核CPU是双核的。从功能上看,双核CPU相当于两个单核CPU(如在多处理器主板上)。每个核心都有自己的寄存器、缓存、指令流水线、执行单元、MMU等。原则上,双核处理器的性能与运行在相同时钟频率下的两个单核处理器的SMP系统相当。
未来的双核和四核CPU会在一定程度上共享片上缓存,这有优缺点。一方面,它限制了单个CPU在不与其他CPU竞争的情况下可访问的缓存量;另一方面,共享缓存减少了同步单独缓存所需的周期数。因此,一些应用程序会从多处理器间的缓存共享中受益,而另一些则会受到影响,很难简单判定哪种方式更好。
2. SMP机器上的编程
大多数应用程序无需知道自己运行在多处理器机器上,硬件和操作系统会处理大部分细节。操作系统负责在CPU间分配任务和平衡负载。不过,有些应用程序需要了解CPU的数量和类型,以充分利用硬件资源。
2.1 Linux调度器与SMP
Linux内核2.0版本引入了SMP。SMP调度器试图在CPU间高效分配任务和线程,充分利用硬件资源。其启发式算法基于一些假设,最基本的是所有CPU是相等的,这也是“对称多处理”中“对称”的含义。
但SMT和多核处理器等创新对这一假设提出了挑战。在先进的多处理器架构中,往往需要应用程序了解硬件特性并为调度器提供信息。
SMP调度器倾向于将进程保持在同一个CPU上,因为(由于延迟TLB刷新)进程很可能能够重用TLB。但对于SMT