我正在使用 c1.xlarge 实例对 EC2 上的研究数据库进行一些实验。据我所知,c1.xlarge 使用 8 个超线程虚拟 CPU。亚马逊还表示,此实例使用“Intel Xeon 系列”的物理处理器。
同样,系统有 8 个 CPU、4 个工作线程和 4 个其他线程(锁管理器、通信器、2 个序列器)。因此,我们有一个 1 比 1 的线程与 CPU 对应关系。正在运行的实验是检查点。我们正在创建第 9 个线程来获取检查点并评估其对吞吐量的影响。当将这个第 9 个线程分配给包含 4 个工作线程之一或锁管理器的 CPU 之一时,结果是可以预测的 - 吞吐量会下降。但是,当我们将这个第 9 个线程放在剩余的 CPU 之一上时,我们预计不会看到任何影响,因为这些线程不是系统的瓶颈,不会影响工作线程。但是,我看到吞吐量下降了,我正在寻找解释。
我开始怀疑,如果在非工作线程上生成的检查点线程以某种方式使工作线程的缓存无效,则可能会出现问题。我不太了解缓存在此特定 EC2 实例或 Intel Xeon 处理器上的工作原理,因此我正在寻找有关此缓存工作原理的解释,特别是它在超线程系统中的工作原理。超线程处理器上的两个 CPU 是否共享缓存?线程是否跨处理器共享缓存?
我找到了一本英特尔手册,上面说英特尔至强处理器 3000 和 5000 系列使用“智能二级缓存,可实现两个内核之间的数据共享,以减少内存流量”。实例可能正在使用这种缓存吗?如果是,是否意味着所有 8 个 vCPU 都共享缓存?
答案1
由于您的服务器操作系统和 EC2 硬件之间存在虚拟化层,因此甚至无法保证 vCPU 中的所有 8 个线程都在同一物理 CPU 上执行。尝试从客户机内部测量诸如缓存命中或模式之类的东西是徒劳的。您无法看到实际的硬件。
一个 vCPU 并不代表一个物理 CPU 核心,8 个 vCPU 也不代表一个具有 8 个逻辑核心的物理 CPU。当然,大多数虚拟机管理程序的 CPU 调度程序都会尝试在多进程系统中调度来自同一客户机的线程在同一个核心上执行,但这并不能保证。