编程接口指南

地址组概述

共享内存多处理器计算机包含多个 CPU。每个 CPU 均可访问计算机中的所有内存。在某些共享内存多处理器中,内存体系结构使每个 CPU 访问某些内存区域的速度快于访问其他区域的速度。

当具有此类内存体系结构的计算机运行 Solaris 软件时,将有关给定 CPU 与给定内存区域之间最短访问时间的信息提供给内核可以提高系统性能。地址组 (lgroup) 概念就是为处理这些信息而引入的。lgroup 概念是内存位置优化 (Memory Placement Optimization, MPO) 功能的一部分。

lgroup 是指包含 CPU 类和内存类设备的集合,此集合中的每个 CPU 均可在限定的延迟间隔内访问此集合中的任何内存。延迟间隔的值表示此 lgroup 中所有 CPU 与所有内存之间的最低公用延迟。定义 lgroup 的延迟界限并未限制此 lgroup 的成员之间的最大延迟。延迟界限的值是适用于此组中所有可能的 CPU-内存对的最小延迟。

lgroup 具有分层结构。lgroup 分层结构是一个有向无环图 (Directed Acyclic Graph, DAG) 并与树类似,只不过一个 lgroup 可能具有多个父级。根 lgroup 包含系统中的所有资源,还可以包含子 lgroup。此外,根 lgroup 还有一个特点,即它的延迟值是系统内所有 lgroup 中的最大值。所有子 lgroup 的延迟值均小于根 lgroup 的延迟值。越接近根的 lgroup 的延迟值越大,越接近叶的 lgroup 的延迟值越小。

如果一台计算机中的所有 CPU 访问所有内存所需的时间相同,则可以使用一个 lgroup 表示此计算机(请参见图 4–1)。如果一台计算机中的某些 CPU 访问某些内存区域所需的时间短于访问其他内存区域所需的时间,则可以使用多个 lgroup 表示此计算机(请参见图 4–2)。

图 4–1 单地址组示意图

计算机中的所有 CPU 均可在相差无几的时间段内访问内存。

图 4–2 多地址组示意图

计算机的 CPU 和内存资源按限定的延迟间隔进行分组。

lgroup 分层结构的组织简化了在系统中查找最近资源的任务。创建每个线程时即为其指定了一个主 lgroup。缺省情况下,操作系统将尝试从线程的主 lgroup 为线程分配资源。例如,缺省情况下,Solaris 内核将尝试安排线程在其主 lgroup 中的 CPU 上运行,并从其主 lgroup 中分配此线程的内存。如果线程的主 lgroup 中没有所需的资源,则内核可以遍历 lgroup 分层结构,从主 lgroup 的父级中查找下一个最近的资源。如果主 lgroup 的父级中没有所需的资源,则内核将继续遍历 lgroup 分层结构,在主 lgroup 的上一级祖先 lgroup 中进行查找。根 lgroup 是计算机中所有其他 lgroup 的最后一级祖先,它包含计算机中的所有资源。

lgroup API 针对应用程序引入了 lgroup 概念,以便进行观察和性能调优。新 API 包含在名为 liblgrp 的新库中。应用程序可以使用 API 执行以下任务: