当前位置: 首页 > Linux

LinuxKernel101-CompetitionManagementunderNUMA

时间:2023-04-06 21:01:46 Linux

本文参考了以下论文:ACaseforNUMA-awareContentionManagementonMulticoreSystems点击链接下载查看上一篇文章上一篇简单介绍一下一起来看看多CPU下的NUMA架构。在NUMA架构中,内存被划分为多个不同的区域,CPU和相邻的内存组成一个node节点。OS在调度的时候会优先使用相邻的内存,从而解决了之前UMA架构下BUS带来的性能问题(因为MultipleCPU会竞争这个bus)。同时也谈到了MySQL在NUMA架构下遇到的“swapinsanity”问题,即当MySQL占用的内存超过(100/节点总数)%时,由于调度的存在“优先使用相邻内存”的模式,导致内存分配不均匀导致即使在整体系统内存充足的情况下,也会出现大量“异常”的swap现象。如下图所示:本文对本文内容进行总结。本文将从“资源竞争管理”的角度出发。将会看到UMA时代的竞争管理算法将不再适用于NUMA,具体原因分析和解决方案。看完之后,相信你会对NUMA有更深入的了解,对多CPU时代的编程有一个感性的认识。UMA争用管理算法不适用于NUMA。哪里有共享资源,哪里就会有争用。哪里有争用,哪里就有性能损失。多核系统中共享资源的竞争一直是个大问题。内核相互竞争共享资源,例如末级缓存(LLC)、系统请求队列和内存管理器。目前流行的解决方案称为竞争感知调度器(competition-awarescheduler,以下简称CAS),意思是它可以区分出正在相互竞争共享资源的线程,然后将它们分离到不同的域中。有数据表明,这种调度方式在最坏情况下可以提高80%的性能,平均可以提高10%。该算法在UMA中是有效的。但需要考虑的是,NUMA与UMA相比有一个很大的区别,即UMA只有一个内存节点,并配备了内存控制器;而NUMA中每个节点里面都有一个内存节点,每个节点都配有一个内存控制器,如下图:16个核心分为4个节点,每个节点都有独立的内存(当然每个核心也可以在任何位置访问内存)。那么这种调度方式行得通吗?如果你只是简单地想一想,你可能会想为什么不呢?如果同一个节点的线程竞争特别激烈,那我就把其中一个移到另一个节点上。虽然这会带来一定的延迟,但竞争会得到解决。那么,事情就没有那么简单了。一切真理都来自实践。实践发现,这种调度算法在NUMA上实现时,不仅没有很好地解决竞争,反而性能下降了30%。原因将在下文给出。为什么不适用?在NUMA架构下,CAS会感知存在哪些竞争线程,然后将其中一个线程移动到不同的域。这样就会导致一种情况:线程运行的节点上没有分配线程的内存。比如上图中,一个线程本来是运行在c1上的,后来因为竞争被移到了c5上,但是它的内存还在M1上。我们把这种由于移动线程而导致线程和内存分离的行为称为“NUMA-agnosticmigrations”(agnostic中文是不可知的意思,自己理解吧~)。NUMA-agnostic迁移带来了一些问题,比较明显的是线程获取内存的延迟增加,但这不是关键。更重要的是,NUMA-agnosticmigrations不能缓解一些关键资源(内存控制器)的竞争问题,甚至会引起对更多资源(互连连接)的竞争。下图很重要,请仔细看:说明:T和C分别代表两个程序(线程)图0:两个程序处于和平状态,没有竞争。图1:CT内存中有一个节点,与内存控制器(MC)形成竞争关系。(应该有访问延迟,图中可能忘记了)图2:两个程序都需要尝试CPU之间的快速通道,导致互连连接(IC)竞争。同时,访问远程内存会产生访问延迟(RL)。图3:内存控制器(MC)争用,加上远程访问延迟(RL)。图4:TC位于CPU中并与末级缓存(CA)竞争。图5:CA+RL图6:CA+MC图7:在最坏的情况下,CA+MC+IC+MC实验发现图3的性能下降了110%。原因是线程仍在相互竞争内存控制器。当NUMA-agnosticmigrations迁移线程时,很可能最终会导致这种情况。假设有两个线程A和B,A运行在图1中的c1上,B运行在c2上,它们之间存在竞争(竞争末级缓存)。现在有一个contention-aware调度器检测到A和B之间的竞争关系,所以它把B移到了c5,现在A和B不再竞争末级缓存。事实上,在UMA系统中,这确实有效(尽管内存控制器仍然存在竞争)。但是对于NUMA来说,A和B的内存还在同一个地方,对最关键的资源内存控制器的争夺并没有解决。并且它还引入了两个问题,这会严重影响B.interconnect连接的性能。(这个影响会很严重)远程访问。综上所述,与NUMA无关的迁移不能提高甚至降低NUMA竞争管理的性能。按照对性能的影响程度排序:无法解决与内存控制器的竞争关系(内存还在原来的地方)。导致额外的互连连接。导致额外的远程访问。原文中还提到了作者自己开发的一个解决方案,有兴趣的同学可以阅读原文。相信看完之后,你应该对NUAM的架构有了更感性的认识。我觉得写的很好(看在gakki的份上)要不要给我点个赞鼓励一下?广告时间,欢迎大家关注我的微信公众号。同时本文与github同步:https://github.com/liaochangjiang/TechDaily