web-dev-qa-db-ja.com

mysqlクラスターがCPUの複数のコアを使用しないのはなぜですか?

Ndbmtdプロセスに問題があります。次の構成を使用すると、Intel(R)Pentium(R)CPU G6950 @ 2.80GHzを搭載したサーバー上の両方のコアが完全に使用されると思います。残念ながら、これは発生していません。 id = 0のコアのみが使用されます。 2つ目は負荷がありません。

私の構成:

[ndbd default]
MaxNoOfExecutionThreads=2
[ndbd]
HostName=192.168.1.4
NodeId=3
LockExecuteThreadToCPU=0,1
LockMaintThreadsToCPU=0

mpstat -P ALL

08:47:09 AM     CPU     %user     %Nice   %system   %iowait    %steal     %idle
08:47:11 AM     all     44.64      0.00      1.75      1.25      0.00     52.37
08:47:11 AM       0     89.45      0.00      1.01      2.01      0.00      7.54
08:47:11 AM       1      0.99      0.00      1.98      0.00      0.00     97.03

ただし、「top」はndbmtdプロセスの90%の使用率を示しています(なぜですか?)

私のトポロジ-2つのデータノード、VMのndb_mgmt、VMのmysqld。

私のCPUはそのようなことができませんか、何かが正しく構成されていないか、mysql-clusterがマルチコアプロセッサを完全にロードできませんか?

4
John

MySQL Cluster開発チームにチェックインしたところ、FrazerClementがこの詳細な応答を提供しました。テストがどのように行われるかをお知らせください。 MySQL Clusterに固有の質問をするのに適した場所は、フォーラムです:forums.mysql.com/list.php?25

そのCPUにはハイパースレッディングがありません

つまり、2つの実際のコアがあります。

これによると: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-programs-ndbmtd.html 、MaxNoOfExecutionThreadsは2-の場合は2に設定する必要があります。コアホスト。

また、2に設定すると、次のようになります。

1 local query handler (LQH) thread

1 transaction coordinator (TC) thread

1 transporter thread

1 subscription manager (SUMA) thread

プレーンなndbdでは、これらの関数はすべて1つのスレッドにあり、ndbmtdであり、MaxNoOfExecutionThreads = 2であるため、次のように分割されます。これは「機能的な」分割であることに注意してください。各スレッドには異なる役割があるため、作業の一部を実行するには異なる量のCPUが必要です。特定のスループットに対して、各スレッドタイプによって消費されるCPUの量は異なります。

MaxNoOfExecutionThreadsの値を大きくすると、LQHスレッドの数が増えます。これは、それぞれが「LQH」作業の均等なシェアを占め、相互にバランスが取れている必要があります。ただし、他のスレッドのCPU消費量は異なります。

最後に、LockExecuteThreadToCpu = 0,1行は、一種のラウンドロビンスタイルでndbmtdによって使用されます。残念ながら、提供されるCPUの数に対して実行スレッド(4)が多すぎて、バランスをとることができません。つまり、1つのLQHスレッドに1つのCPUが与えられ、他の3つのスレッドが他のCPUを共有するということです。これは、見られる不均衡を説明することができます。

スレッドのCPUへのマッピングは、開始時に各ndbmtdプロセスのstdout(ndb_outログ)に出力されることに注意してください。同様の設定を使用すると、次のようになります。

NDBMT:num_threads = 4

DBSPJインスタンスのインスタンス化No = 0

ThreadId = 3936をCPUid = 0にロックします

ThreadId = 3935をCPUid = 0にロックします

ThreadId = 3937をCPUID = 0にロックします

警告:LockExecuteThreadToCPUで指定されたCPUが少なすぎます。 2つしか指定されていませんが、4つが必要でした。これにより、競合が発生する可能性があります。

LQHスレッドを専用CPUと他のスレッドに割り当てると、残りのthr:2 tid:3940 cpu:0 OK PGMAN(1)DBACC(1)DBLQH(1)DBTUP(1)BACKUP(1)DBTUX(1)RESTOREが共有されます(1)

thr:3 tid:3933 cpu:1 OK CMVMI(0)

thr:1 tid:3939 cpu:1 OK BACKUP(0)DBLQH(0)DBACC(0)DBTUP(0)SUMA(0)DBTUX(0)TSMAN(0)LGMAN(0)PGMAN(0)RESTORE(0) DBINFO(0)PGMAN(5)

thr:0 tid:3938 cpu:1 OK DBTC(0)DBDIH(0)DBDICT(0)NDBCNTR(0)QMGR(0)NDBFS(0)TRIX(0)DBUTIL(0)DBSPJ(0)

1つの実行スレッド(3940)がCPU 0にロックされ、他のスレッドがCPU 1にロックされていることがわかります。3940はLQHワーカースレッドです(番号が0より大きいDBLQHブロックがあるため(DBLQH(1))) 。

この例では、CMVMI(ネットワークIOレシーバー)、DBLQH(0)/ SUMA(0)、およびDBTC(0)スレッドはすべてCPU1にロックされています。

したがって、使用されるトラフィックによっては、CPU0とCPU1で消費されるCPUの量のバランスが崩れます。 'maintenance'スレッドもCPU0にロックされているため、CPU 0が飽和状態になると、状況が悪化する可能性があることに注意してください。

このトラフィックタイプのボトルネックがLQH処理である場合、MaxNoOfExecutionThreadsを4以上に増やすと、2つのLQH「ワーカー」が存在し、それぞれにコアが割り当てられます。ただし、他のスレッドもコアの1つを使用するため、そのコア上のLQHワーカーのリソースが制限されます。

LQHワーカーがボトルネックでない場合、追加のLQHワーカーがあると、他のスレッドで使用可能なCPUが減少し、スループットが低下する可能性があります。

トラフィックの負荷を試し、ndbmtd出力をチェックしてマッピングを理解し、達成可能なスループットとレイテンシーを測定し、CPUコアのバランスと使用率を観察することをお勧めします。

6
Mat Keep

CPUに2つのコアがある場合は、MaxNoOfExecutionThreads = 4を設定する必要があると思います。このプロパティは、ndbdセクションで設定する必要があります。

[ndbd] MaxNoOfExecutionThreads = 2

このパラメータを2xcoresに設定する必要がある理由はわかりませんが、これは機能します

1
tomek