From a75e31e0ad6501a778d0cf11f824aa7d6d85cd9d Mon Sep 17 00:00:00 2001 From: gatieme Date: Tue, 2 Aug 2016 23:07:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86README.md...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01-description/00-(n)uma/README.md | 165 ++++++ .../01-description/00-(n)uma/images/num2.gif | Bin 0 -> 11503 bytes .../01-description/00-(n)uma/images/numa.gif | Bin 0 -> 24838 bytes .../01-description/00-(n)uma/images/numa.png | Bin 0 -> 124001 bytes .../01-description/00-(n)uma/images/uma.gif | Bin 0 -> 10825 bytes .../01-description/01-memory/README.md | 491 ++++++++++++++++++ study/kernel/02-memory/1.sh | 100 ++++ 7 files changed, 756 insertions(+) create mode 100644 study/kernel/02-memory/01-description/00-(n)uma/README.md create mode 100644 study/kernel/02-memory/01-description/00-(n)uma/images/num2.gif create mode 100644 study/kernel/02-memory/01-description/00-(n)uma/images/numa.gif create mode 100644 study/kernel/02-memory/01-description/00-(n)uma/images/numa.png create mode 100644 study/kernel/02-memory/01-description/00-(n)uma/images/uma.gif create mode 100644 study/kernel/02-memory/01-description/01-memory/README.md create mode 100644 study/kernel/02-memory/1.sh diff --git a/study/kernel/02-memory/01-description/00-(n)uma/README.md b/study/kernel/02-memory/01-description/00-(n)uma/README.md new file mode 100644 index 0000000..f5ad5d1 --- /dev/null +++ b/study/kernel/02-memory/01-description/00-(n)uma/README.md @@ -0,0 +1,165 @@ +服务器体系与共享存储器架构 +======= + +| 日期 | 内核版本 | 架构| 作者 | GitHub| CSDN | +| ------- |:-------:|:-------:|:-------:|:-------:|:-------:| +| 2016-06-14 | [Linux-4.7](http://lxr.free-electrons.com/source/?v=4.7) | X86 & arm | [gatieme](http://blog.csdn.net/gatieme) | [LinuxDeviceDrivers](https://github.com/gatieme/LDD-LinuxDeviceDrivers) | [Linux内存管理](http://blog.csdn.net/gatieme/article/category/6225543) | + +#1 3种系统架构与2种存储器共享方式 +------- + +##1.1 架构概述 + +从系统架构来看,目前的商用服务器大体可以分为三类 + +* 对称多处理器结构(SMP:Symmetric Multi-Processor) + +* 非一致存储访问结构(NUMA:Non-Uniform Memory Access) + +* 海量并行处理结构(MPP:Massive Parallel Processing)。 + + +共享存储型多处理机有两种模型 + +* 均匀存储器存取(Uniform-Memory-Access,简称UMA)模型 + +* 非均匀存储器存取(Nonuniform-Memory-Access,简称NUMA)模型 + +而我们后面所提到的COMA和ccNUMA都是NUMA结构的改进 + + +#1.2 SMP(Symmetric Multi-Processor) +------- + + +所谓对称多处理器结构,是指服务器中多个CPU对称工作,无主次或从属关系。 + +各CPU共享相同的物理内存,每个 CPU访问内存中的任何地址所需时间是相同的,因此SMP也被称为**一致存储器访问结构(UMA:Uniform Memory Access)** + +对SMP服务器进行扩展的方式包括增加内存、使用更快的CPU、增加CPU、扩充I/O(槽口数与总线数)以及添加更多的外部设备(通常是磁盘存储)。 + +SMP服务器的主要特征是共享,系统中所有资源(CPU、内存、I/O等)都是共享的。也正是由于这种特征,导致了SMP服务器的主要问题,那就是它的扩展能力非常有限。 + +对于SMP服务器而言,每一个共享的环节都可能造成SMP服务器扩展时的瓶颈,而最受限制的则是内存。由于每个CPU必须通过相同的内存总线访问相同的内存资源,因此随着CPU数量的增加,内存访问冲突将迅速增加,最终会造成CPU资源的浪费,使CPU性能的有效性大大降低。实验证明,SMP服务器CPU利用率最好的情况是2至4个CPU + +![UMA多处理机模型如图所示](./images/uma.gif) + + +图中,物理存储器被所有处理机均匀共享。所有处理机对所有存储字具有相同的存取时间,这就是为什么称它为均匀存储器存取的原因。每台处理机可以有私用高速缓存,外围设备也以一定形式共享。 + +##1.3 NUMA(Non-Uniform Memory Access) +------- + +由于SMP在扩展能力上的限制,人们开始探究如何进行有效地扩展从而构建大型系统的技术,NUMA就是这种努力下的结果之一 + + +利用NUMA技术,可以把几十个CPU(甚至上百个CPU)组合在一个服务器内. + + + + +![NUMA多处理机模型如图所示](./images/numa.png) + + + +NUMA多处理机模型如图所示,其访问时间随存储字的位置不同而变化。其共享存储器物理上是分布在所有处理机的本地存储器上。所有本地存储器的集合组成了全局地址空间,可被所有的处理机访问。处理机访问本地存储器是比较快的,但访问属于另一台处理机的远程存储器则比较慢,因为通过互连网络会产生附加时延。 + + +NUMA服务器的基本特征是具有多个CPU模块,每个CPU模块由多个CPU(如4个)组成,并且具有独立的本地内存、I/O槽口等。 + +![NUMA多处理机模型如图所示](./images/numa.gif) + + +由于其节点之间可以通过互联模块(如称为Crossbar Switch)进行连接和信息交互,因此每个CPU可以访问整个系统的内存(这是NUMA系统与MPP系统的重要差别)。显然,访问本地内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致存储访问NUMA的由来。 + +由于这个特点,为了更好地发挥系统性能,开发应用程序时需要尽量减少不同CPU模块之间的信息交互。利用NUMA技术,可以较好地解决原来SMP系统的扩展问题,在一个物理服务器内可以支持上百个CPU。比较典型的NUMA服务器的例子包括HP的Superdome、SUN15K、IBMp690等。 + +但NUMA技术同样有一定缺陷,由于访问远地内存的延时远远超过本地内存,因此当CPU数量增加时,系统性能无法线性增加。如HP公司发布Superdome服务器时,曾公布了它与HP其它UNIX服务器的相对性能值,结果发现,64路CPU的Superdome (NUMA结构)的相对性能值是20,而8路N4000(共享的SMP结构)的相对性能值是6.3. 从这个结果可以看到,8倍数量的CPU换来的只是3倍性能的提升. + + + +#1.4 MPP(Massive Parallel Processing) +------- + + +和NUMA不同,MPP提供了另外一种进行系统扩展的方式,它由多个SMP服务器通过一定的节点互联网络进行连接,协同工作,完成相同的任务,从用户的角度来看是一个服务器系统。其基本特征是由多个SMP服务器(每个SMP服务器称节点)通过节点互联网络连接而成,每个节点只访问自己的本地资源(内存、存储等),是一种完全无共享(Share Nothing)结构,因而扩展能力最好,理论上其扩展无限制,目前的技术可实现512个节点互联,数千个CPU。目前业界对节点互联网络暂无标准,如 NCR的Bynet,IBM的SPSwitch,它们都采用了不同的内部实现机制。但节点互联网仅供MPP服务器内部使用,对用户而言是透明的。 + +在MPP系统中,每个SMP节点也可以运行自己的操作系统、数据库等。但和NUMA不同的是,它不存在异地内存访问的问题。换言之,每个节点内的CPU不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配(Data Redistribution)。 + +但是MPP服务器需要一种复杂的机制来调度和平衡各个节点的负载和并行处理过程。目前一些基于MPP技术的服务器往往通过系统级软件(如数据库)来屏蔽这种复杂性。举例来说,NCR的Teradata就是基于MPP技术的一个关系数据库软件,基于此数据库来开发应用时,不管后台服务器由多少个节点组成,开发人员所面对的都是同一个数据库系统,而不需要考虑如何调度其中某几个节点的负载。 + +#2 三种体系架构之间的差异 +------- + +##2.1 NUMA、MPP、SMP之间性能的区别 +------- + +NUMA的节点互联机制是在同一个物理服务器内部实现的,当某个CPU需要进行远地内存访问时,它必须等待,这也是NUMA服务器无法实现CPU增加时性能线性扩展。 + +MPP的节点互联机制是在不同的SMP服务器外部通过I/O实现的,每个节点只访问本地内存和存储,节点之间的信息交互与节点本身的处理是并行进行的。因此MPP在增加节点时性能基本上可以实现线性扩展。 + +SMP所有的CPU资源是共享的,因此完全实现线性扩展。 + +##2.2 NUMA、MPP、SMP之间扩展的区别 +------- + +NUMA理论上可以无限扩展,目前技术比较成熟的能够支持上百个CPU进行扩展。如HP的SUPERDOME。 +MPP理论上也可以实现无限扩展,目前技术比较成熟的能够支持512个节点,数千个CPU进行扩展。 +SMP扩展能力很差,目前2个到4个CPU的利用率最好,但是IBM的BOOK技术,能够将CPU扩展到8个。 +MPP是由多个SMP构成,多个SMP服务器通过一定的节点互联网络进行连接,协同工作,完成相同的任务。 + +##2.3 MPP和SMP、NUMA应用之间的区别 +------- + +**MPP的优势** + +MPP系统不共享资源,因此对它而言,资源比SMP要多,当需要处理的事务达到一定规模时,MPP的效率要比SMP好。由于MPP系统因为要在不同处理单元之间传送信息,在通讯时间少的时候,那MPP系统可以充分发挥资源的优势,达到高效率。也就是说:操作相互之间没有什么关系,处理单元之间需要进行的通信比较少,那采用MPP系统就要好。因此,MPP系统在决策支持和数据挖掘方面显示了优势。 + +**SMP的优势** + +MPP系统因为要在不同处理单元之间传送信息,所以它的效率要比SMP要差一点。在通讯时间多的时候,那MPP系统可以充分发挥资源的优势。因此当前使用的OTLP程序中,用户访问一个中心数据库,如果采用SMP系统结构,它的效率要比采用MPP结构要快得多。 + +**NUMA架构的优势** + +NUMA架构来看,它可以在一个物理服务器内集成许多CPU,使系统具有较高的事务处理能力,由于远地内存访问时延远长于本地内存访问,因此需要尽量减少不同CPU模块之间的数据交互。显然,NUMA架构更适用于OLTP事务处理环境,当用于数据仓库环境时,由于大量复杂的数据处理必然导致大量的数据交互,将使CPU的利用率大大降低。 + +##3 总结 +------- + + +传统的多核运算是使用SMP(Symmetric Multi-Processor )模式:将多个处理器与一个集中的存储器和I/O总线相连。所有处理器只能访问同一个物理存储器,因此SMP系统有时也被称为一致存储器访问(UMA)结构体系,一致性意指无论在什么时候,处理器只能为内存的每个数据保持或共享唯一一个数值。很显然,SMP的缺点是可伸缩性有限,因为在存储器和I/O接口达到饱和的时候,增加处理器并不能获得更高的性能,与之相对应的有AMP架构,不同核之间有主从关系,如一个核控制另外一个核的业务,可以理解为多核系统中控制平面和数据平面。 + +NUMA模式是一种分布式存储器访问方式,处理器可以同时访问不同的存储器地址,大幅度提高并行性。 NUMA模式下,处理器被划分成多个"节点"(node), 每个节点被分配有的本地存储器空间。 所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。 + +NUMA 的主要优点是伸缩性。NUMA 体系结构在设计上已超越了 SMP 体系结构在伸缩性上的限制。通过 SMP,所有的内存访问都传递到相同的共享内存总线。这种方式非常适用于 CPU 数量相对较少的情况,但不适用于具有几十个甚至几百个 CPU 的情况,因为这些 CPU 会相互竞争对共享内存总线的访问。NUMA 通过限制任何一条内存总线上的 CPU 数量并依靠高速互连来连接各个节点,从而缓解了这些瓶颈状况。 + + +名词解释 + +| 概念 | 描述 | +|:----:|:---:| +| SMP | 称为共享存储型多处理机(Shared Memory mulptiProcessors), 也称为对称型多处理机(Symmetry MultiProcessors) | +| UMA | 称为均匀存储器存取(Uniform-Memory-Access) | +| NUMA | 非均匀存储器存取(Nonuniform-Memory-Access) | +| COMA | 只用高速缓存的存储器结构(Cache-Only Memory Architecture) | +| ccNUMA | 高速缓存相关的非一致性内存访问(CacheCoherentNon-UniformMemoryAccess) | + +**UMA** + + 物理存储器被所有处理机均匀共享。所有处理机对所有存储字具有相同的存取时间,这就是为什么称它为均匀存储器存取的原因。每台处理机可以有私用高速缓存,外围设备也以一定形式共享。 + +**NUMA** + + 其访问时间随存储字的位置不同而变化。其共享存储器物理上是分布在所有处理机的本地存储器上。所有本地存储器的集合组成了全局地址空间,可被所有的处理机访问。处理机访问本地存储器是比较快的,但访问属于另一台处理机的远程存储器则比较慢,因为通过互连网络会产生附加时延。 + +**COMA** + + + 一种只用高速缓存的多处理机。COMA模型是NUMA机的一种特例,只是将后者中分布主存储器换成了高速缓存, 在每个处理机结点上没有存储器层次结构,全部高速缓冲存储器组成了全局地址空间。远程高速缓存访问则借助于分布高速缓存目录进行。 + 是CC-NUMA体系结构的竞争者,两者拥有相同的目标,但实现方式不同。COMA节点不对内存部件进行分布,也不通过互连设备使整个系统保持一致性。COMA节点没有内存,只在每个Quad中配置大容量的高速缓存 + +**CCNUMA** + + 在CC-NUMA系统中,分布式内存相连接形成单一内存,内存之间没有页面复制或数据复制,也没有软件消息传送。CC-NUMA只有一个内存映象,存储部件利用铜缆和某些智能硬件进行物理连接。CacheCoherent是指不需要软件来保持多个数据拷贝的一致性,也不需要软件来实现操作系统与应用系统的数据传输。如同在SMP模式中一样,单一操作系统和多个处理器完全在硬件级实现管理。 + + diff --git a/study/kernel/02-memory/01-description/00-(n)uma/images/num2.gif b/study/kernel/02-memory/01-description/00-(n)uma/images/num2.gif new file mode 100644 index 0000000000000000000000000000000000000000..16e45bc789dd234d8d295c3613730de3ac76b7d1 GIT binary patch literal 11503 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 Y_|XcGPbYiAOvN8xQ23iya^OGx9}0iOoB#j- literal 0 HcmV?d00001 diff --git a/study/kernel/02-memory/01-description/00-(n)uma/images/numa.gif b/study/kernel/02-memory/01-description/00-(n)uma/images/numa.gif new file mode 100644 index 0000000000000000000000000000000000000000..148a112b3355865caeaec5c8905af52aa827909b GIT binary patch literal 24838 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 literal 0 HcmV?d00001 diff --git a/study/kernel/02-memory/01-description/00-(n)uma/images/numa.png b/study/kernel/02-memory/01-description/00-(n)uma/images/numa.png new file mode 100644 index 0000000000000000000000000000000000000000..314df9b5c6494f0e99a8c443779fd8bafd0371d7 GIT binary patch literal 124001 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 literal 0 HcmV?d00001 diff --git a/study/kernel/02-memory/01-description/00-(n)uma/images/uma.gif b/study/kernel/02-memory/01-description/00-(n)uma/images/uma.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb3eb135fae860b1f46ec1ffcb43fb2e4c62f367 GIT binary patch literal 10825 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物理存储器被所有处理机均匀共享。所有处理机对所有存储字具有相同的存取时间,这就是为什么称它为均匀存储器存取的原因。每台处理机可以有私用高速缓存,外围设备也以一定形式共享。 + +很显然,SMP的缺点是可伸缩性有限,因为在存储器和I/O接口达到饱和的时候,增加处理器并不能获得更高的性能,与之相对应的有AMP架构,不同核之间有主从关系,如一个核控制另外一个核的业务,可以理解为多核系统中控制平面和数据平面。 + +**NUMA** + + +NUMA模式是一种分布式存储器访问方式,处理器可以同时访问不同的存储器地址,大幅度提高并行性。 NUMA总是多处理器计算机,系统的哪个CPU都有本地内存, 可支持快速的访问, 各个处理器之前通过总线链接起来, 以支持堆其他CPU的本地内存的访问, 当然访问要比本地内存慢. + + +NUMA模式下,处理器被划分成多个"节点"(node), 每个节点被分配有的本地存储器空间。 所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。 + +>其访问时间随存储字的位置不同而变化。其共享存储器物理上是分布在所有处理机的本地存储器上。所有本地存储器的集合组成了全局地址空间,可被所有的处理机访问。处理机访问本地存储器是比较快的,但访问属于另一台处理机的远程存储器则比较慢,因为通过互连网络会产生附加时延。 + +NUMA 的主要优点是伸缩性。NUMA 体系结构在设计上已超越了 SMP 体系结构在伸缩性上的限制。通过 SMP,所有的内存访问都传递到相同的共享内存总线。这种方式非常适用于 CPU 数量相对较少的情况,但不适用于具有几十个甚至几百个 CPU 的情况,因为这些 CPU 会相互竞争对共享内存总线的访问。NUMA 通过限制任何一条内存总线上的 CPU 数量并依靠高速互连来连接各个节点,从而缓解了这些瓶颈状况。 + + +#(N)UMA模型中linux内存的机构 +------- + +Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来表示内存. + +Linux内核通过插入一些兼容层, 使得不同体系结构的差异很好的被隐藏起来, 内核对一致和非一致内存访问使用相同的数据结构 + +非一致存储器访问(NUMA)模式下 + +* 处理器被划分成多个"节点"(node), 每个节点被分配有的本地存储器空间. 所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多 + + +* 内存被分割成多个区域(BANK,也叫"簇"),依据簇与处理器的"距离"不同, 访问不同簇的代码也会不同. 比如,可能把内存的一个簇指派给每个处理器,或则某个簇和设备卡很近,很适合DMA,那么就指派给该设备。因此当前的多数系统会把内存系统分割成2块区域,一块是专门给CPU去访问,一块是给外围设备板卡的DMA去访问 + +>在UMA系统中, 内存就相当于一个只使用一个NUMA节点来管理整个系统的内存. 而内存管理的其他地方则认为他们就是在处理一个(伪)NUMA系统. + + + +#物理内存描述 +------- + +Linux把物理内存划分为三个层次来管理 + +* 存储节点(Node) + +* 管理区(Zone) + +* 页面(Page) + +为了支持NUMA模型,也即CPU对不同内存单元的访问时间可能不同,此时系统的物理内存被划分为几个节点(node), 一个node对应一个内存簇bank,即每个内存簇被认为是一个节点 + +* 首先, 内存被划分为结点. 每个节点关联到系统中的一个处理器, 内核中表示为pg_data_t的实例. + +* 接着各个节点又被划分为内存域, 低端的16MB被划分为ZONE_DMA, 然后是可直接映射到内核的普通内存域ZONE_NORMAL,最后是超出了内核段的物理地址域ZONE_HIGHMEM, 被称为高端内存. + +在一个单独的节点内,任一给定CPU访问页面所需的时间都是相同的。然而,对不同的CPU,这个时间可能就不同。对每个CPU而言,内核都试图把耗时节点的访问次数减到最少这就要小心地选择CPU最常引用的内核数据结构的存放位置. + +对于UMA体系的,系统中只有一个node + +在LINUX中引入一个数据结构`struct pglist_data` ,来描述一个node,定义在[`include/linux/mmzone.h`](http://lxr.free-electrons.com/source/include/linux/mmzone.h#L630) 文件中。(这个结构被typedef pg_data_t)。 + + +* 对于NUMA系统来讲, 整个系统的内存由一个[node_data](http://lxr.free-electrons.com/source/arch/s390/numa/numa.c#L23)的pg_data_t指针数组来管理。(因为可能有多个node),系统中的每个节点链接到一个以NULL结尾的[pgdat_list](http://lxr.free-electrons.com/source/arch/ia64/include/asm/numa.h#L27)链表中,而其中的每个节点利用pd_data_tnode_next字段链接到下一个节点。 + + +* 对于PC这样的UMA系统,使用struct pglist_datacontig_page_data ,作为系统唯一的node管理所有的内存区域。(UMA系统中中只有一个node) + + +#内存区域的划分 +------- + +##内存节点node与zone管理区 +------- + +在内存中,每个簇所对应的node又被分成的称为管理区(zone)的块,它们各自描述在内存中的范围。一个管理区(zone)由[struct zone](http://lxr.free-electrons.com/source/include/linux/mmzone.h#L326)结构体来描述,在linux-2.4.37之前的内核中是用[`typedef struct zone_struct zone_t `](http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=2.4.37#L47)数据结构来描述) + +管理区的类型有如下几种 +* ZONE_DMA +* ZONE_NORMAL +* ZONE_HIGHMEM这三种类型 + +不同的管理区的用途是不一样的,ZONE_DMA类型的内存区域在物理内存的低端,主要是ISA设备只能用低端的地址做DMA操作。ZONE_NORMAL类型的内存区域直接被内核映射到线性地址空间上面的区域(line address space),ZONE_HIGHMEM将保留给系统使用,是系统中预留的可用内存空间,不能被内核直接映射。 + +对于x86机器,管理区(内存区域)类型如下分布 +| 类型 | 区域 | +| :------- | ----: | +| ZONE_DMA | 0~16MB | +| ZONE_NORMAL | 16MB~896MB | +| ZONE_HIGHMEM | 896MB~物理内存结束 | + +##内存页page +------- + +大多数内核(kernel)的操作只使用ZONE_NORMAL区域,系统内存由很多固定大小的内存块组成的,这样的内存块称作为“页”(PAGE), + +x86体系结构中,page的大小为4096个字节。 + +每个物理的页由一个`struct page`的数据结构对象来描述。页的数据结构对象都保存在`mem_map`全局数组中,该数组通常被存放在ZONE_NORMAL的首部,或者就在小内存系统中为装入内核映像而预留的区域之后。从载入内核的低地址内存区域的后面内存区域,也就是ZONE_NORMAL开始的地方的内存的页的数据结构对象,都保存在这个全局数组中。 + + + +##高端内存 +------- + +由于能够被Linux内核直接访问的ZONE_NORMAL区域的内存空间也是有限的,所以LINUX提出了高端内存(High memory)的概念,并且允许对高端内存的访问 + + + +#内存节点node +------- +>参照 +> +>[内存管理(一)内存模型之Node](http://biancheng.dnbcw.info/linux/387391.html) +> +> [Linux 内存管理 重要结构体](http://blog.chinaunix.net/uid-26009500-id-3078986.html) +> +>[Bootmem机制](http://blog.csdn.net/samssm/article/details/25064897) +> +>[Linux-2.6.32 NUMA架构之内存和调度](http://www.cnblogs.com/zhenjing/archive/2012/03/21/linux_numa.html) + + +表示node的数据结构为[`typedef struct pglist_data pg_data_t`](http://lxr.free-electrons.com/source/include/linux/mmzone.h#L630), 这个结构定义在[linux/mmzone.h](http://lxr.free-electrons.com/source/include/linux/mmzone.h#L691)中,结构体的内容如下 + + +```cpp +typedef struct pglist_data { + struct zone node_zones[MAX_NR_ZONES]; + struct zonelist node_zonelists[MAX_ZONELISTS]; + int nr_zones; +#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */ + struct page *node_mem_map; +#ifdef CONFIG_MEMCG + struct page_cgroup *node_page_cgroup; +#endif +#endif +#ifndef CONFIG_NO_BOOTMEM + struct bootmem_data *bdata; +#endif +#ifdef CONFIG_MEMORY_HOTPLUG + /* + * Must be held any time you expect node_start_pfn, node_present_pages + * or node_spanned_pages stay constant. Holding this will also + * guarantee that any pfn_valid() stays that way. + * + * Nests above zone->lock and zone->size_seqlock. + */ + spinlock_t node_size_lock; +#endif + unsigned long node_start_pfn; + unsigned long node_present_pages; /* total number of physical pages */ + unsigned long node_spanned_pages; /* total size of physical page + range, including holes */ + int node_id; + nodemask_t reclaim_nodes; /* Nodes allowed to reclaim from */ + wait_queue_head_t kswapd_wait; + wait_queue_head_t pfmemalloc_wait; + struct task_struct *kswapd; /* Protected by lock_memory_hotplug() */ + int kswapd_max_order; + enum zone_type classzone_idx; +#ifdef CONFIG_NUMA_BALANCING + /* Lock serializing the migrate rate limiting window */ + spinlock_t numabalancing_migrate_lock; + + /* Rate limiting time interval */ + unsigned long numabalancing_migrate_next_window; + + /* Number of pages migrated during the rate limiting time interval */ + unsigned long numabalancing_migrate_nr_pages; +#endif + + /* reserved for Red Hat */ + RH_KABI_RESERVE(1) + RH_KABI_RESERVE(2) + RH_KABI_RESERVE(3) + RH_KABI_RESERVE(4) + +} pg_data_t; + +``` + +| 字段| 描述 | +| :------- | ----: | +|node_zones | 每个Node划分为不同的zone,分别为ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM | +|node_zonelists | 这个是备用节点及其内存域的列表,当当前节点的内存不够分配时,会选取访问代价最低的内存进行分配。分配内存操作时的区域顺序,当调用free_area_init_core()时,由mm/page_alloc.c文件中的build_zonelists()函数设置 | +|nr_zones | 当前节点中不同内存域zone的数量,1到3个之间。并不是所有的node都有3个zone的,比如一个CPU簇就可能没有ZONE_DMA区域 | +| node_mem_map | node中的第一个page,它可以指向mem_map中的任何一个page,指向page实例数组的指针,用于描述该节点所拥有的的物理内存页,它包含了该页面所有的内存页,被放置在全局mem_map数组中 | +| bdata | 这个仅用于引导程序boot 的内存分配,内存在启动时,也需要使用内存,在这里内存使用了自举内存分配器,这里bdata是指向内存自举分配器的数据结构的实例 | +| node_start_pfn | pfn是page frame number的缩写。这个成员是用于表示node中的开始那个page在物理内存中的位置的。是当前NUMA节点的第一个页帧的编号,系统中所有的页帧是依次进行编号的,这个字段代表的是当前节点的页帧的起始值,对于UMA系统,只有一个节点,所以该值总是0 | +|node_present_pages | node中的真正可以使用的page数量 | +|node_spanned_pages | 该节点以页帧为单位的总长度,这个不等于前面的node_present_pages,因为这里面包含空洞内存 | +|node_id | node的NODE ID 当前节点在系统中的编号,从0开始 | +| kswapd_wait | node的等待队列,交换守护列队进程的等待列表| +| kswapd_max_order | 需要释放的区域的长度,以页阶为单位 | +| classzone_idx | 这个字段暂时没弄明白,不过其中的zone_type是对ZONE_DMA,ZONE_DMA32,ZONE_NORMAL,ZONE_HIGH,ZONE_MOVABLE,__MAX_NR_ZONES的枚举 | + + +在新的linux3.x~linux4.x的内核中,Linux定义了一个大小为[MAX_NUMNODES](http://lxr.free-electrons.com/source/include/linux/numa.h#L11)类型为[`pgdat_list`](http://lxr.free-electrons.com/source/arch/ia64/mm/discontig.c#L50)数组,数组的大小根据[CONFIG_NODES_SHIFT](http://lxr.free-electrons.com/source/include/linux/numa.h#L6)的配置决定。对于UMA来说,NODES_SHIFT为0,所以MAX_NUMNODES的值为1。内核提供了[for_each_online_pgdat(pgdat)](http://lxr.free-electrons.com/source/include/linux/mmzone.h#L867) 来遍历节点 + +而在linux-2.4.x之前的内核中所有的节点,都由一个被称为[pgdat_list](http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=2.4.37#L169)的链表维护。这些节点都放在该链表中,均由函数[init_bootmem_core()](http://lxr.free-electrons.com/source/mm/bootmem.c#L96)初始化结点。内核提供了[宏for_each_pgdat(pgdat)]http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=2.4.37#L169)来遍历节点链表。 + +对于单一node的系统,contig_page_data 是系统唯一的node数据结构对象。查看contig_page_data的定义[linux-4.5](http://lxr.free-electrons.com/source/mm/bootmem.c#L27),[linux-2.4.37](http://lxr.free-electrons.com/source/mm/numa.c?v=2.4.37#L15) + +#管理区Zone +------- +linux系统中,内存中的每个簇所对应的node又被分成的称为管理区(zone)的块, + +>一个管理区(zone)由[struct zone](http://lxr.free-electrons.com/source/include/linux/mmzone.h#L326)结构体来描述(linux-3.8~目前linux4.5),而在linux-2.4.37之前的内核中是用[`typedef struct zone_struct zone_t `](http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=2.4.37#L47)数据结构来描述) + +zone对象用于跟踪诸如页面使用情况的统计数,空闲区域信息和锁信息 + +>里面保存着内存使用状态信息,如page使用统计,未使用的内存区域,互斥访问的锁(LOCKS)等。 + +`struct zone`在`linux/mmzone.h`中定义,在linux-4.5的内核中可以使用[`sed -n '326,526p' mmzone.h`](http://blog.csdn.net/gatieme/article/details/51150115)来查看其定义 + +```cpp +struct zone { + /* Fields commonly accessed by the page allocator */ + + /* zone watermarks, access with *_wmark_pages(zone) macros */ + unsigned long watermark[NR_WMARK]; + + /* + * When free pages are below this point, additional steps are taken + * when reading the number of free pages to avoid per-cpu counter + * drift allowing watermarks to be breached + */ + unsigned long percpu_drift_mark; + + /* + * We don't know if the memory that we're going to allocate will be freeable + * or/and it will be released eventually, so to avoid totally wasting several + * GB of ram we must reserve some of the lower zone memory (otherwise we risk + * to run OOM on the lower zones despite there's tons of freeable ram + * on the higher zones). This array is recalculated at runtime if the + * sysctl_lowmem_reserve_ratio sysctl changes. + */ + unsigned long lowmem_reserve[MAX_NR_ZONES]; + + /* + * This is a per-zone reserve of pages that should not be + * considered dirtyable memory. + */ + unsigned long dirty_balance_reserve; + +#ifdef CONFIG_NUMA + int node; + /* + * zone reclaim becomes active if more unmapped pages exist. + */ + unsigned long min_unmapped_pages; + unsigned long min_slab_pages; +#endif + struct per_cpu_pageset __percpu *pageset; + /* + * free areas of different sizes + */ + spinlock_t lock; + int all_unreclaimable; /* All pages pinned */ +#if defined CONFIG_COMPACTION || defined CONFIG_CMA + /* Set to true when the PG_migrate_skip bits should be cleared */ + bool compact_blockskip_flush; + + /* pfns where compaction scanners should start */ + unsigned long compact_cached_free_pfn; + unsigned long compact_cached_migrate_pfn; +#endif +#ifdef CONFIG_MEMORY_HOTPLUG + /* see spanned/present_pages for more description */ + seqlock_t span_seqlock; +#endif + struct free_area free_area[MAX_ORDER]; + +#ifndef CONFIG_SPARSEMEM + /* + * Flags for a pageblock_nr_pages block. See pageblock-flags.h. + * In SPARSEMEM, this map is stored in struct mem_section + */ + unsigned long *pageblock_flags; +#endif /* CONFIG_SPARSEMEM */ + +#ifdef CONFIG_COMPACTION + /* + * On compaction failure, 1<> PAGE_SHIFT */ + unsigned long zone_start_pfn; + + /* + * spanned_pages is the total pages spanned by the zone, including + * holes, which is calculated as: + * spanned_pages = zone_end_pfn - zone_start_pfn; + * + * present_pages is physical pages existing within the zone, which + * is calculated as: + * present_pages = spanned_pages - absent_pages(pages in holes); + * + * managed_pages is present pages managed by the buddy system, which + * is calculated as (reserved_pages includes pages allocated by the + * bootmem allocator): + * managed_pages = present_pages - reserved_pages; + * + * So present_pages may be used by memory hotplug or memory power + * management logic to figure out unmanaged pages by checking + * (present_pages - managed_pages). And managed_pages should be used + * by page allocator and vm scanner to calculate all kinds of watermarks + * and thresholds. + * + * Locking rules: + * + * zone_start_pfn and spanned_pages are protected by span_seqlock. + * It is a seqlock because it has to be read outside of zone->lock, + * and it is done in the main allocator path. But, it is written + * quite infrequently. + * + * The span_seq lock is declared along with zone->lock because it is + * frequently read in proximity to zone->lock. It's good to + * give them a chance of being in the same cacheline. + * + * Write access to present_pages at runtime should be protected by + * lock_memory_hotplug()/unlock_memory_hotplug(). Any reader who can't + * tolerant drift of present_pages should hold memory hotplug lock to + * get a stable value. + * + * Read access to managed_pages should be safe because it's unsigned + * long. Write access to zone->managed_pages and totalram_pages are + * protected by managed_page_count_lock at runtime. Idealy only + * adjust_managed_page_count() should be used instead of directly + * touching zone->managed_pages and totalram_pages. + */ + unsigned long spanned_pages; + unsigned long present_pages; + unsigned long managed_pages; + + /* + * Number of MIGRATE_RESEVE page block. To maintain for just + * optimization. Protected by zone->lock. + */ + int nr_migrate_reserve_block; + + /* + * rarely used fields: + */ + const char *name; + + + +} ____cacheline_internodealigned_in_smp; + +``` + +| 字段| 描述 | +| :------- | ----: | +free_pages:未分配使用的page的数量。 +pages_min, pages_low and pages_high: zone对page管理调度的一些参数,下面章节将讲到。 +lowmem_reserve[MAX_NR_ZONES]: 为了防止一些代码必须运行在低地址区域,所以事先保留一些低地址区域的内存。 +pageset[NR_CPUS]: page管理的数据结构对象,内部有一个page的列表(list)来管理。每个CPU维护一个page list,避免自旋锁的冲突。这个数组的大小和NR_CPUS(CPU的数量)有关,这个值是编译的时候确定的。 +lock: 对zone并发访问的保护的自旋锁 +free_area: 页面使用状态的信息,以每个bit标识对应的page是否可以分配 +lru_lock: LRU(最近最少使用算法)的自旋锁 +reclaim_in_progress: 回收操作的原子锁 +active_list: 活跃的page的list +inactive_list: 不活跃的page的list +refill_counter:从活跃的page list中移除的page的数量 +nr_active: 活跃的page的数量 +nr_inactive: 不活跃的page的数量 +pressure: 检查回收page的指标 +all_unreclaimable: 如果检测2次还是不能回收zone的page的话,则设置为1 +pages_scanned: 上次回收page后,扫描过的page的数量。 +wait_table:等待一个page释放的等待队列哈希表。它会被wait_on_page(),unlock_page()函数使用. 用哈希表,而不用一个等待队列的原因,防止进程长期等待资源。 +wait_table_hash_nr_entries: 哈希表中的等待队列的数量 +zone_pgdat: 指向这个zone所在的pglist_data对象。 +zone_start_pfn: 和node_start_pfn的含义一样。这个成员是用于表示zone中的开始那个page在物理内存中的位置的present_pages, spanned_pages: 和node中的类似的成员含义一样。 +zone: zone的名字,字符串表示: "DMA","Normal" 和"HighMem" +ZONE_PADDING: 由于自旋锁频繁的被使用,因此为了性能上的考虑,将某些成员对齐到cache line中,有助于提高执行的性能。使用这个宏,可以确定zone->lock,zone->lru_lock,zone->pageset这些成员使用不同的cache line. +Zone的管理调度的一些参数: (Zone watermarks), +英文直译为zone的水平,打个比喻,就像一个水库,水存量很小的时候加大进水量,水存量达到一个标准的时候,减小进水量,当快要满的时候,可能就关闭了进水口。pages_min, pages_low and pages_high就类似与这个标准。 +当系统中可用内存很少的时候,系统代码kswapd被唤醒,开始回收释放page。pages_min, pages_low and pages_high这些参数影响着这个代码的行为。 +每个zone有三个水平标准:pages_min, pages_low and pages_high,帮助确定zone中内存分配使用的压力状态。kswapd和这3个参数的互动关系如下图: + +page_min中所表示的page的数量值,是在内存初始化的过程中调用free_area_init_core()中计算的。这个数值是根据zone中的page的数量除以一个>1的系数来确定的。通常是这样初始化的ZoneSizeInPages/128。 +page_low: 当空闲页面的数量达到page_low所标定的数量的时候,kswapd线程将被唤醒,并开始释放回收页面。这个值默认是page_min的2倍。 +page_min: 当空闲页面的数量达到page_min所标定的数量的时候, 分配页面的动作和kswapd线程同步运行 +page_high: 当空闲页面的数量达到page_high所标定的数量的时候, kswapd线程将重新休眠,通常这个数值是page_min的3倍。 +zone的大小的计算 +setup_memory()函数计算每个zone的大小: + +PFN是物理内存以Page为单位的偏移量。系统可用的第一个PFN是min_low_pfn变量,开始与_end标号的后面,也就是kernel结束的地方。在文件mm/bootmem.c中对这个变量作初始化。系统可用的最后一个PFN是max_pfn变量,这个变量的初始化完全依赖与硬件的体系结构。x86的系统中,find_max_pfn()函数通过读取e820表获得最高的page frame的数值。同样在文件mm/bootmem.c中对这个变量作初始化。e820表是由BIOS创建的。 +x86中,max_low_pfn变量是由find_max_low_pfn()函数计算并且初始化的,它被初始化成ZONE_NORMAL的最后一个page的位置。这个位置是kernel直接访问的物理内存,也是关系到kernel/userspace通过“PAGE_OFFSET宏”把线性地址内存空间分开的内存地址位置。(原文:This is the physical memory directly accessible by the kernel and is related to the kernel/userspace split in the linear address space marked by PAGE OFFSET.)我理解为这段地址kernel可以直接访问,可以通过PAGE_OFFSET宏直接将kernel所用的虚拟地址转换成物理地址的区段。在文件mm/bootmem.c中对这个变量作初始化。在内存比较小的系统中max_pfn和max_low_pfn的值相同 +min_low_pfn, max_pfn和max_low_pfn这3个值,也要用于对高端内存(high memory)的起止位置的计算。在arch/i386/mm/init.c文件中会对类似的highstart_pfn和highend_pfn变量作初始化。这些变量用于对高端内存页面的分配。后面将描述。 +Zone等待队列表(zone wait queue table) +当对一个page做I/O操作的时候,I/O操作需要被锁住,防止不正确的数据被访问。进程在访问page前,调用wait_on_page()函数,使进程加入一个等待队列。访问完成后,UnlockPage()函数解锁其他进程对page的访问。其他正在等待队列中的进程被唤醒。每个page都可以有一个等待队列,但是太多的分离的等待队列使得花费太多的内存访问周期。替代的解决方法,就是将所有的队列放在struct zone数据结构中。 +也可以有一种可能,就是struct zone中只有一个队列,但是这就意味着,当一个page unlock的时候,访问这个zone里内存page的所有休眠的进程将都被唤醒,这样就会出现拥堵(thundering herd)的问题。建立一个哈希表管理多个等待队列,能解决这个问题,zone->wait_table就是这个哈希表。哈希表的方法可能还是会造成一些进程不必要的唤醒。但是这种事情发生的机率不是很频繁的。下面这个图就是进程及等待队列的运行关系: + +等待队列的哈希表的分配和建立在free_area_init_core()函数中进行。哈希表的表项的数量在wait_table_size() 函数中计算,并且保持在zone->wait_table_size成员中。最大4096个等待队列。最小是NoPages / PAGES_PER_WAITQUEUE的2次方,NoPages是zone管理的page的数量,PAGES_PER_WAITQUEUE被定义256。(原文:For smaller tables, the size of the table is the minimum power of 2 required to store NoPages / PAGES PER WAITQUEUE number of queues, where NoPages is the number of pages in the zone and PAGE PER WAITQUEUE is defined to be 256.) +下面这个公式可以用于计算这个值: + +zone->wait_table_bits用于计算:根据page 地址得到需要使用的等待队列在哈希表中的索引的算法因子。page_waitqueue()函数负责返回zone中page所对应等待队列。它用一个基于struct page虚拟地址的简单的乘法哈希算法来确定等待队列的。 +page_waitqueue()函数用GOLDEN_RATIO_PRIME的地址和“右移zone→wait_table_bits一个索引值”的一个乘积来确定等待队列在哈希表中的索引的。 +Zone的初始化 +在kernel page table通过paging_init()函数完全建立起z来以后,zone被初始化。下面章节将描述这个。当然不同的体系结构这个过程肯定也是不一样的,但它们的目的却是相同的:确定什么参数需要传递给free_area_init()函数(对于UMA体系结构)或者free_area_init_node()函数(对于NUMA体系结构)。这里省略掉NUMA体系结构的说明。 +free_area_init()函数的参数: +unsigned long *zones_sizes: 系统中每个zone所管理的page的数量的数组。这个时候,还没能确定zone中那些page是可以分配使用的(free)。这个信息知道boot memory allocator完成之前还无法知道。 +来源: http://www.uml.org.cn/embeded/201208071.asp \ No newline at end of file diff --git a/study/kernel/02-memory/1.sh b/study/kernel/02-memory/1.sh new file mode 100644 index 0000000..f92cce2 --- /dev/null +++ b/study/kernel/02-memory/1.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# Simple print cpu topology +# Author: kodango + +function get_nr_processor() +{ + grep '^processor' /proc/cpuinfo | wc -l +} + +function get_nr_socket() +{ + grep 'physical id' /proc/cpuinfo | awk -F: '{ + print $2 | "sort -un"}' | wc -l +} + +function get_nr_siblings() +{ + grep 'siblings' /proc/cpuinfo | awk -F: '{ + print $2 | "sort -un"}' +} + +function get_nr_cores_of_socket() +{ + grep 'cpu cores' /proc/cpuinfo | awk -F: '{ + print $2 | "sort -un"}' +} + +echo '===== CPU Topology Table =====' +echo + +echo '+--------------+---------+-----------+' +echo '| Processor ID | Core ID | Socket ID |' +echo '+--------------+---------+-----------+' + +while read line; do + if [ -z "$line" ]; then + printf '| %-12s | %-7s | %-9s |\n' $p_id $c_id $s_id + echo '+--------------+---------+-----------+' + continue + fi + + if echo "$line" | grep -q "^processor"; then + p_id=`echo "$line" | awk -F: '{print $2}' | tr -d ' '` + fi + + if echo "$line" | grep -q "^core id"; then + c_id=`echo "$line" | awk -F: '{print $2}' | tr -d ' '` + fi + + if echo "$line" | grep -q "^physical id"; then + s_id=`echo "$line" | awk -F: '{print $2}' | tr -d ' '` + fi +done < /proc/cpuinfo + +echo + +awk -F: '{ + if ($1 ~ /processor/) { + gsub(/ /,"",$2); + p_id=$2; + } else if ($1 ~ /physical id/){ + gsub(/ /,"",$2); + s_id=$2; + arr[s_id]=arr[s_id] " " p_id + } +} + +END{ + for (i in arr) + printf "Socket %s:%s\n", i, arr[i]; +}' /proc/cpuinfo + +echo +echo '===== CPU Info Summary =====' +echo + +nr_processor=`get_nr_processor` +echo "Logical processors: $nr_processor" + +nr_socket=`get_nr_socket` +echo "Physical socket: $nr_socket" + +nr_siblings=`get_nr_siblings` +echo "Siblings in one socket: $nr_siblings" + +nr_cores=`get_nr_cores_of_socket` +echo "Cores in one socket: $nr_cores" + +let nr_cores*=nr_socket +echo "Cores in total: $nr_cores" + +if [ "$nr_cores" = "$nr_processor" ]; then + echo "Hyper-Threading: off" +else + echo "Hyper-Threading: on" +fi + +echo +echo '===== END =====' \ No newline at end of file