プログラミングインタフェース

ローカリティグループの概要

メモリー共有型マルチプロセッサマシンには、複数の CPU が搭載されています。 それぞれの CPU は、そのマシンのすべてのメモリーにアクセスできます。メモリー共有型マルチプロセッサには、CPU ごとに特定のメモリー領域に対して、より高速なアクセスを可能にするメモリーアーキテクチャを採用しているものがあります。

そのようなメモリーアーキテクチャのマシンで Solaris を実行した場合、特定の CPU による特定のメモリー領域への最短アクセス時間に関するカーネル情報が与えられると、システムのパフォーマンスを向上させることができます。 Solaris では、この情報を処理するためにローカリティグループ (lgroup) による抽象化が導入されています。 lgroup による抽象化は、メモリー配置の最適化 (MPO) 機能の一部です。

lgroup は CPU およびメモリーを模したデバイスの集合です。それぞれの集合内のデバイスは、決められた応答時間の間隔範囲で集合内の他のデバイスにアクセスできます。各 lgroup の応答時間値は、オペレーティングシステムによって選択されます。

lgroup は階層構造になっています。lgroup 階層は、Directed Acyclic Graph (DAG) です。ツリー構造と似ていますが、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 API は、監視と性能チューニングを目的とするアプリケーションのために lgroup の抽象化をエクスポートします。アプリケーションは API を使用して lgroup 階層を探索し、指定された lgroup の内容と特性を検出できます。また、lgroup でのスレッドとメモリー配置を操作することも可能です。 新しい API は、新規ライブラリ liblgrp に含まれています。