
特定のNUMAノード/ソケットに関連付けられているメモリへのアクセスを無効にする方法はありますか?沼マシン?
私たちは、HP DL560システムに関してデータベースベンダーといくつかの紛争を経験しています。 DBセールス技術サポート担当者は、DL560が利用できず、スロットが少ないため、新しいDL360を購入する必要があることに喜んでいました。私は彼らがソケット間のメモリアクセス速度に興味があると思います。彼らは私がDL560を維持するために2つのスロットを空にしなければならないと提案しました。私は彼らが間違っていると思いますが(別名狂った)、私の立場がしっかりしていることを証明するためにテストが必要です。
私の構成:
マシンには4つのソケットがあり、各ソケットには22のハイパースレッド物理コア、合計176の見かけのコア、合計1.5Tのメモリがあります。オペレーティングシステムはRed Hat Enterprise Linux Serverバージョン7.4です。
lscpuは次の内容(部分)を表示します。
$ lscpu | egrep 'NUMA|ore'
Thread(s) per core: 2
Core(s) per socket: 22
NUMA node(s): 4
NUMA node0 CPU(s): 0-21,88-109
NUMA node1 CPU(s): 22-43,110-131
NUMA node2 CPU(s): 44-65,132-153
NUMA node3 CPU(s): 66-87,154-175
物理ハードウェアにアクセスできる場合は、ポイントを証明するために両方のソケットからプロセッサを取り出すことを検討できますが、ハードウェアにアクセスする権限や権限はありません。
次善策は、オペレーティングシステムを使用してソケットを仮想的に無効にすることです。私はこれを読んだ協会これを使用してプロセッササービスを停止できます。
echo 0 > /sys/devices/system/cpu/cpu3/online
プロセッサが動作を停止したという事実は、メモリに関して何の意味もない。
私はソケット#3のすべてのプロセッサを閉じました。 lscpuを使用してソケット#3のプロセッサを見つけます。
for num in {66..87} {154..175}
do
echo 0 > /sys/devices/system/cpu/cpu${num}/online
cat /sys/devices/system/cpu/cpu${num}/online
done
そして得る:
$ grep N3 /proc/$$/numa_maps
7fe5daa79000 default file=/usr/lib64/libm-2.17.so mapped=16 mapmax=19 N3=16 kernelpagesize_kB=4
この記事を正しく読んでいる場合は、現在のプロセスがソケット#3のメモリを使用していることを示します。プロセッサーをシャットダウンする以外は、シェルはすでに実行中です。
新しいプロセスを開始すると、メモリをキャッチしようとして最善を尽くします。
$ cat / proc / 18824 / numa_mapsクエリN3 |
最初はレコードは返されませんが、長い間メモリを消費した後、ノード3でメモリの使用を開始します。
ノード0,1,2を使用してプログラムを実行し、ノード0,1,2にバインドしようとしましたが、期待どおりにnumactl
機能しました.ベンダーのソフトウェアを制御できず、Linuxでゼロを使用する規制がないことを除いて、1,2はこれを実行して他のプロセスset_mempolicy
で使用されるサービスを設定しますnumactl
。
プロセッサを物理的に取り外す以外に、この問題を強制する方法はありますか?
答え1
私は彼らがソケット間のメモリアクセス速度に興味があると思います。彼らは私がDL560を維持するために2つのスロットを空にしなければならないと提案しました。
これはQPIまたはUPIリンクの数とIntelのスケーラビリティに関連しています(Xeonに言及しているため)。NCPUが4S、S4S、S8Sかどうか。しかし、スロットが4つあるという事実は、合理的な速度(S4Sが4Sより速い)でどこからでもRAMにアクセスできることを意味しますが、このレベルで最悪の場合はディスクまたはディスクサイズの順序にアクセスするよりも数倍高速です。他のタイプのPCIeストレージ。
4ソケットシステムのCPU 0、1、2、または3の特定のコアで実行される特定のプロセスの場合、最速のRAMアクセスは、そのCPUのメモリコントローラ内のRAMチッププールへのものです。そのRAMにアクセスする前に別のCPUへのQPI / UPIリンクをスキップする必要がある場合は、次のようにします。ゆっくりまさか最高。ただし、まず共有RAMが不足していることを考慮して、これらすべてを評価する必要があります。
はい、この問題を強制的に解決する方法があります。
中央処理ユニット- プロセスをプロセッサとメモリノードのサブセットに制限します。
cpusetファイルシステムは、プロセスのプロセッサ配置とメモリ配置を制御するために使用されるカーネルcpusetメカニズムへの擬似ファイルシステムインタフェースです。通常は/dev/cpusetにインストールされます。
答え2
cgroupsを使用してCPUソケットをグループとして定義し、cgrules(cgred、cgoupsルールエンジンデーモン)を使用してプロセスをグループに割り当てます。しかし、まずLinuxでは、Numaポリシーを使用してプロセスとメモリが割り当てられます。基本的な戦略は、プロセスが実行されているCPUソケットにプロセスのメモリを配置することです。より多くのメモリが必要になるたびに、ディスクスワップスペースを使用せずに他のNumaノードのメモリを使用する方が良いことに注意してください。
答え3
このプログラムは、プロセスがすでに実行された後に使用されます。
taskset
- プロセスのCPUアフィニティの設定または検索tasketコマンドは、指定されたpidに対して実行中のプロセスのCPUアフィニティを設定または取得するため、または指定されたCPUアフィニティで新しいコマンドを開始するために使用されます。 CPU アフィニティは、プロセスをシステムの特定の CPU セットに「バインド」するスケジューラ属性です。 Linux スケジューラは指定された CPU アフィニティを尊重し、プロセスは他の CPU で実行されません。
...他のユーザーに属するプロセスを変更するには、ユーザーに
CAP_SYS_NICE
CPUの好みが必要です。ユーザーはすべてのプロセスの相関マスクを取得できます。
http://manpages.ubuntu.com/manpages/jammy/man1/taskset.1.html