~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/mm/numa.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/translations/zh_CN/mm/numa.rst (Version linux-6.12-rc7) and /Documentation/translations/zh_CN/mm/numa.rst (Version linux-6.10.14)


  1 :Original: Documentation/mm/numa.rst                1 :Original: Documentation/mm/numa.rst
  2                                                     2 
  3 :翻译:                                            3 :翻译:
  4                                                     4 
  5  司延腾 Yanteng Si <siyanteng@loongson.cn>        5  司延腾 Yanteng Si <siyanteng@loongson.cn>
  6                                                     6 
  7 :校译:                                            7 :校译:
  8                                                     8 
  9                                                     9 
 10 始于1999年11月,作者: <kanoj@sgi.com>      10 始于1999年11月,作者: <kanoj@sgi.com>
 11                                                    11 
 12 ==========================                         12 ==========================
 13 何为非统一内存访问(NUMA)?               13 何为非统一内存访问(NUMA)?
 14 ==========================                         14 ==========================
 15                                                    15 
 16 这个问题可以从几个视角来回答:     16 这个问题可以从几个视角来回答:硬件观点和Linux软件视角。
 17                                                    17 
 18 从硬件角度看,NUMA系统是一个由多     18 从硬件角度看,NUMA系统是一个由多个组件或装配组成的计算机平台,每个组件可能包含0个或更多的CPU、
 19 本地内存和/或IO总线。为了简洁起     19 本地内存和/或IO总线。为了简洁起见,并将这些物理组件/装配的硬件视角与软件抽象区分开来,我们在
 20 本文中称这些组件/装配为“单元”     20 本文中称这些组件/装配为“单元”。
 21                                                    21 
 22 每个“单元”都可以看作是系统的     22 每个“单元”都可以看作是系统的一个SMP[对称多处理器]子集——尽管独立的SMP系统所需的一些组件可能
 23 不会在任何给定的单元上填充。NUMA     23 不会在任何给定的单元上填充。NUMA系统的单元通过某种系统互连连接在一起——例如,交叉开关或点对点
 24 链接是NUMA系统互连的常见类型。这     24 链接是NUMA系统互连的常见类型。这两种类型的互连都可以聚合起来,以创建NUMA平台,其中的单元与其
 25 他单元有多个距离。                        25 他单元有多个距离。
 26                                                    26 
 27 对于Linux,感兴趣的NUMA平台主要是     27 对于Linux,感兴趣的NUMA平台主要是所谓的缓存相干NUMA--简称ccNUMA系统系统。在ccNUMA系统中,
 28 所有的内存都是可见的,并且可以     28 所有的内存都是可见的,并且可以从连接到任何单元的任何CPU中访问,缓存一致性是由处理器缓存和/或
 29 系统互连在硬件中处理。                  29 系统互连在硬件中处理。
 30                                                    30 
 31 内存访问时间和有效的内存带宽取     31 内存访问时间和有效的内存带宽取决于包含CPU的单元或进行内存访问的IO总线距离包含目标内存的单元
 32 有多远。例如,连接到同一单元的C     32 有多远。例如,连接到同一单元的CPU对内存的访问将比访问其他远程单元的内存经历更快的访问时间和
 33 更高的带宽。 NUMA平台可以在任何     33 更高的带宽。 NUMA平台可以在任何给定单元上访问多种远程距离的(其他)单元。
 34                                                    34 
 35 平台供应商建立NUMA系统并不只是为     35 平台供应商建立NUMA系统并不只是为了让软件开发人员的生活变得有趣。相反,这种架构是提供可扩展
 36 内存带宽的一种手段。然而,为了     36 内存带宽的一种手段。然而,为了实现可扩展的内存带宽,系统和应用软件必须安排大部分的内存引用
 37 [cache misses]到“本地”内存——同     37 [cache misses]到“本地”内存——同一单元的内存,如果有的话——或者到最近的有内存的单元。
 38                                                    38 
 39 这就自然而然有了Linux软件对NUMA系     39 这就自然而然有了Linux软件对NUMA系统的视角:
 40                                                    40 
 41 Linux将系统的硬件资源划分为多个     41 Linux将系统的硬件资源划分为多个软件抽象,称为“节点”。Linux将节点映射到硬件平台的物理单元
 42 上,对一些架构的细节进行了抽象     42 上,对一些架构的细节进行了抽象。与物理单元一样,软件节点可能包含0或更多的CPU、内存和/或IO
 43 总线。同样,对“较近”节点的内     43 总线。同样,对“较近”节点的内存访问——映射到较近单元的节点——通常会比对较远单元的访问经历更快
 44 的访问时间和更高的有效带宽。         44 的访问时间和更高的有效带宽。
 45                                                    45 
 46 对于一些架构,如x86,Linux将“隐     46 对于一些架构,如x86,Linux将“隐藏”任何代表没有内存连接的物理单元的节点,并将连接到该单元
 47 的任何CPU重新分配到代表有内存的     47 的任何CPU重新分配到代表有内存的单元的节点上。因此,在这些架构上,我们不能假设Linux将所有
 48 的CPU与一个给定的节点相关联,会     48 的CPU与一个给定的节点相关联,会看到相同的本地内存访问时间和带宽。
 49                                                    49 
 50 此外,对于某些架构,同样以x86为     50 此外,对于某些架构,同样以x86为例,Linux支持对额外节点的仿真。对于NUMA仿真,Linux会将现
 51 有的节点或者非NUMA平台的系统内存     51 有的节点或者非NUMA平台的系统内存分割成多个节点。每个模拟的节点将管理底层单元物理内存的一部
 52 分。NUMA仿真对于在非NUMA平台上测     52 分。NUMA仿真对于在非NUMA平台上测试NUMA内核和应用功能是非常有用的,当与cpusets一起使用时,
 53 可以作为一种内存资源管理机制。[     53 可以作为一种内存资源管理机制。[见 Documentation/admin-guide/cgroup-v1/cpusets.rst]
 54                                                    54 
 55 对于每个有内存的节点,Linux构建     55 对于每个有内存的节点,Linux构建了一个独立的内存管理子系统,有自己的空闲页列表、使用中页列表、
 56 使用统计和锁来调解访问。此外,L     56 使用统计和锁来调解访问。此外,Linux为每个内存区[DMA、DMA32、NORMAL、HIGH_MEMORY、MOVABLE
 57 中的一个或多个]构建了一个有序的     57 中的一个或多个]构建了一个有序的“区列表”。zonelist指定了当一个选定的区/节点不能满足分配请求
 58 时要访问的区/节点。当一个区没有     58 时要访问的区/节点。当一个区没有可用的内存来满足请求时,这种情况被称为“overflow 溢出”或
 59 “fallback 回退”。                           59 “fallback 回退”。
 60                                                    60 
 61 由于一些节点包含多个包含不同类     61 由于一些节点包含多个包含不同类型内存的区,Linux必须决定是否对区列表进行排序,使分配回退到不同
 62 节点上的相同区类型,或同一节点     62 节点上的相同区类型,或同一节点上的不同区类型。这是一个重要的考虑因素,因为有些区,如DMA或DMA32,
 63 代表了相对稀缺的资源。Linux选择     63 代表了相对稀缺的资源。Linux选择了一个默认的Node ordered zonelist。这意味着在使用按NUMA距
 64 离排序的远程节点之前,它会尝试     64 离排序的远程节点之前,它会尝试回退到同一节点的其他分区。
 65                                                    65 
 66 默认情况下,Linux会尝试从执行请     66 默认情况下,Linux会尝试从执行请求的CPU被分配到的节点中满足内存分配请求。具体来说,Linux将试
 67 图从请求来源的节点的适当分区列     67 图从请求来源的节点的适当分区列表中的第一个节点进行分配。这被称为“本地分配”。如果“本地”节点不能
 68 满足请求,内核将检查所选分区列     68 满足请求,内核将检查所选分区列表中其他节点的区域,寻找列表中第一个能满足请求的区域。
 69                                                    69 
 70 本地分配将倾向于保持对分配的内     70 本地分配将倾向于保持对分配的内存的后续访问 “本地”的底层物理资源和系统互连——只要内核代表其分配
 71 一些内存的任务后来不从该内存迁     71 一些内存的任务后来不从该内存迁移。Linux调度器知道平台的NUMA拓扑结构——体现在“调度域”数据结构
 72 中[见 Documentation/scheduler/sched-domains.     72 中[见 Documentation/scheduler/sched-domains.rst]——并且调度器试图尽量减少任务迁移到遥
 73 远的调度域中。然而,调度器并没     73 远的调度域中。然而,调度器并没有直接考虑到任务的NUMA足迹。因此,在充分不平衡的情况下,任务可
 74 以在节点之间迁移,远离其初始节     74 以在节点之间迁移,远离其初始节点和内核数据结构。
 75                                                    75 
 76 系统管理员和应用程序设计者可以     76 系统管理员和应用程序设计者可以使用各种CPU亲和命令行接口,如taskset(1)和numactl(1),以及程
 77 序接口,如sched_setaffinity(2),来限     77 序接口,如sched_setaffinity(2),来限制任务的迁移,以改善NUMA定位。此外,人们可以使用
 78 Linux NUMA内存策略修改内核的默认本     78 Linux NUMA内存策略修改内核的默认本地分配行为。 [见
 79 Documentation/admin-guide/mm/numa_memory_polic     79 Documentation/admin-guide/mm/numa_memory_policy.rst].
 80                                                    80 
 81 系统管理员可以使用控制组和CPUsets     81 系统管理员可以使用控制组和CPUsets限制非特权用户在调度或NUMA命令和功能中可以指定的CPU和节点
 82 的内存。 [见 Documentation/admin-guide/cg     82 的内存。 [见 Documentation/admin-guide/cgroup-v1/cpusets.rst]
 83                                                    83 
 84 在不隐藏无内存节点的架构上,Linu     84 在不隐藏无内存节点的架构上,Linux会在分区列表中只包括有内存的区域[节点]。这意味着对于一个无
 85 内存的节点,“本地内存节点”—     85 内存的节点,“本地内存节点”——CPU节点的分区列表中的第一个区域的节点——将不是节点本身。相反,它
 86 将是内核在建立分区列表时选择的     86 将是内核在建立分区列表时选择的离它最近的有内存的节点。所以,默认情况下,本地分配将由内核提供
 87 最近的可用内存来完成。这是同一     87 最近的可用内存来完成。这是同一机制的结果,该机制允许这种分配在一个包含内存的节点溢出时回退到
 88 其他附近的节点。                           88 其他附近的节点。
 89                                                    89 
 90 一些内核分配不希望或不能容忍这     90 一些内核分配不希望或不能容忍这种分配回退行为。相反,他们想确保他们从指定的节点获得内存,或者
 91 得到通知说该节点没有空闲内存。     91 得到通知说该节点没有空闲内存。例如,当一个子系统分配每个CPU的内存资源时,通常是这种情况。
 92                                                    92 
 93 一个典型的分配模式是使用内核的n     93 一个典型的分配模式是使用内核的numa_node_id()或CPU_to_node()函数获得“当前CPU”所在节点的
 94 节点ID,然后只从返回的节点ID请求     94 节点ID,然后只从返回的节点ID请求内存。当这样的分配失败时,请求的子系统可以恢复到它自己的回退
 95 路径。板块内核内存分配器就是这     95 路径。板块内核内存分配器就是这样的一个例子。或者,子系统可以选择在分配失败时禁用或不启用自己。
 96 内核分析子系统就是这样的一个例     96 内核分析子系统就是这样的一个例子。
 97                                                    97 
 98 如果架构支持——不隐藏无内存节     98 如果架构支持——不隐藏无内存节点,那么连接到无内存节点的CPU将总是产生回退路径的开销,或者一些
 99 子系统如果试图完全从无内存的节     99 子系统如果试图完全从无内存的节点分配内存,将无法初始化。为了透明地支持这种架构,内核子系统可
100 以使用numa_mem_id()或cpu_to_mem()函数来    100 以使用numa_mem_id()或cpu_to_mem()函数来定位调用或指定CPU的“本地内存节点”。同样,这是同
101 一个节点,默认的本地页分配将从    101 一个节点,默认的本地页分配将从这个节点开始尝试。
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php