web-dev-qa-db-ja.com

LinuxシステムでNUMAノードのメモリを無効にする方法

[〜#〜] numa [〜#〜] マシン上の特定のNUMAノード/ソケットに関連付けられたメモリへのアクセスを無効にする方法はありますか?

HP DL560マシンについて、ベンダーとの間で少し論争があります。販売タイプのテクニカルサポート担当者は、DL560を使用できなかったが、ソケットの数が少ないため新しいDL360を購入しなければならないことを伝えました。彼らの懸念は、ソケット間メモリへのアクセス速度にあると思います。彼らは、私がDL560を維持することを主張した場合、2つのソケットを空のままにしておくことを推奨しました。私はそれらが間違っている(別名クレイジー)と思いますが、私がしっかりした立場にあることを実証するテストが必要です。

私の構成:
マシンには4つのソケットがあり、それぞれに22個のハイパースレッド物理コアがあり、合計176個の見かけのコアで合計1.5 Tのメモリがあります。オペレーティングシステムは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

物理的なハードウェアにアクセスできた場合、2つのソケットからプロセッサを引き出して自分の要点を証明することを検討しますが、私にはアクセス権がなく、いずれにしてもハードウェアを使い回す許可がありません。

次善の策は、オペレーティングシステムを使用してソケットを仮想的に無効にすることです。私はこれを読みます リンク プロセッサをサービスから外すことができます

echo 0 > /sys/devices/system/cpu/cpu3/online

そして、確かに、プロセッサは使用できなくなりますが、メモリについては何も言えません。

私はソケット#3のすべてのプロセッサをオフにしました(lscpuを使用してSocket#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 | grep N3

最初はレコードを返しませんが、長時間メモリを消費した後、Node 3。

numactlを使用してプログラムを実行し、ノード0、1、2にバインドしてみましたが、期待どおりに動作します...ただし、ベンダーのソフトウェアを制御できず、Linuxに別のソフトウェアを設定するためのプロビジョニングがありませんnumactlで使用されるset_mempolicyサービスで行われるプロセス。

物理的にプロセッサを取り外すのではなく、問題を強制する方法はありますか?

3
user1683793

彼らの懸念は、ソケット間メモリへのアクセス速度にあると思います。彼らは、私がDL560を維持することを主張した場合、2つのソケットを空のままにしておくことを推奨しました。

これは、QPIの数、またはUPIリンクと、nCPUは4S、S4S、S8Sのいずれかです。ただし、4つのソケットがあるという事実は、RAMに適切な速度でどこからでもアクセスできる必要があることを意味します(S4Sはより高速です) 4Sよりも)、しかしこのレベルで最悪の場合、ディスクや他の種類のPCIeストレージにアクセスするよりも桁違いに速くなります。

クワッドソケットシステムのCPU 0、1、2、または3の特定のコアで実行されている特定のプロセスの場合、最速のRAMアクセスはRAMチップがその特定のCPUのメモリコントローラーにぶら下がっています。QPI/ UPIリンクを介して他のCPUにホップする必要がある場合は、そのRAMに到達しますslowerではなくoptimalですが、十分に共有されていないことを考慮してください= RAMそもそも。

はい、問題を強制する方法があり、それは

cpuset-プロセスをプロセッサとメモリノードのサブセットに制限します

Cpusetファイルシステムは、カーネルのcpusetメカニズムへの疑似ファイルシステムインターフェイスであり、プロセスのプロセッサ配置とメモリ配置を制御するために使用されます。通常は/ dev/cpusetにマウントされます。

1
ron