web-dev-qa-db-ja.com

NUMAを使用するWindowsServerを使用して2つのノード間でアプリケーションを実行する

今日はクライアントとおもしろい電話がありました。他のアプリをスケジュールするアプリケーションがありますが、通常、2〜4ノードのNUMA構成のサーバーではまったく問題ありません。

呼び出し時に、2つの非常にCPUを消費するアプリケーションを起動し、両方がNode 0に割り当てられたため、マシン全体で使用率は50%にすぎませんでした。2番目のアプリインスタンスを他のノードでは、すべてのコアを使用していました(一方のアプリで半分、もう一方のアプリで半分)。すべてのコアにアプリを割り当てることは不可能のようでした。

さて、このマシンと私が使用しているマシンとの唯一の違いは、Windowsのタスクマネージャーが個々のコアの長いリストではなくドロップダウンにノードをリストしたことです。したがって、Microsoftはこの制限が何であるかを知っていますが、それはオンラインで調査するのは難しい問題です。

NUMAノードアフィニティを開発する必要があることはかなり明らかですが、今のところ私は問題を理解しようとしています。 1つのスタイルのNUMAマシンで、アプリケーションが両方のノードを透過的に使用できるようにする原因は何ですか。また、この動作の原因は何ですか。

このアーキテクチャは多くの小さなアプリケーションでうまく機能していることがわかりますが、通常は多くのスレッドでモノリシックなアーキテクチャを実行します。

私が戦っているサーバーは、2つのIntel Xeon E5-2690V3CPUを搭載したHPProliantDL388Gen9です。

これを引き起こしているものについての考え?

1
RandomInsano

プロセスは、単一のNUMAノードにのみ割り当てることができます。それが短い答えです。 1つのインスタンスを複数のNUMAノードで強制的に実行することはできません。そしてこれは、NUMAの目的と、64ビットのCPUアフィニティビットマスクを使用するOSで64を超えるCPUコアを許可するという2番目の目的を考えると理にかなっています。

2
dyasta

私はこの問題の専門家ではありませんが、私の意見を取り入れます。

NUMAノードアフィニティを開発する必要があることはかなり明らかですが、今のところ私は問題を理解しようとしています。 1つのスタイルのNUMAマシンで、アプリケーションが両方のノードを透過的に使用できるようにする原因は何ですか。また、この動作の原因は何ですか。

Windowsが「ノード距離」を計算し、さまざまなNUMAノードが相互に通信するのにかかる時間を見積もります。レイテンシーまたは帯域幅ベース(または両方)かどうかはわかりませんが、知っておくことが重要です。

Skylake-Serverなどの最新のマシンでは、「SubNumaクラスタリング」を使用できます。この場合、同じチップのさまざまな部分がさまざまなNUMAノードとして報告されます。ただし、同じチップ内のノード間の差は約10ナノ秒です。別のソケットは約200ナノ秒になる場合があります。

例:サブNUMAクラスタリングがオンになっている2つのXeon Gold(CPUあたり20コア)は、Windowsでは4xNUMAノードのように見えます。チップあたり2-NUMAノード。チップの各半分の「左」の10コアと「右」の10コアを表します。左側に3xメモリコントローラー、右側に3xメモリコントローラー。ただし、すべての20コアは、約80ナノ秒でいずれかのメモリコントローラーと通信できます。彼らは70ナノ秒で「より近い」メモリコントローラーと話すことができます。ほとんど気付かないほどの違いがあるため、Windowsはおそらくこれら2つのNUMAノード間でスレッドをフロートさせることを好みます。

私の仮定では、セットアップのデフォルト設定では、Windowsは、一方の「ノード距離」がスレッドをフロートさせるのに十分短いと判断し、もう一方のセットアップのメモリ距離は、Windowsのデフォルト設定が維持するのに十分な長さであると判断しました。 NUMAノード内のスレッド。


それは私の唯一の理論ではありません。私の2番目の理論は、「プロセッサグループ」で何か奇妙なことが起こっているというものです。 CPUアフィニティマスクはパフォーマンス上の理由から64ビットに制限されているため、プロセッサグループはWin32APIのダーティな互換性ハックです。したがって、64論理コアがWindowsの最大のデフォルトです。

Processor Group APIを介して、64を超える論理コアにアクセスできます。 https://msdn.Microsoft.com/en-us/library/windows/desktop/dd405503(v = vs.85).aspx

つまり、プロセスが別々の「プロセッサグループ」にある場合は、プログラマがプロセッサグループをサポートするようにプログラムを変更することになります。

私は個人的にこのようなもので多くのテストをしていません。しかし、うまくいけば、これはあなたにとって有用な情報です。

1
Dragontamer5788