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がマルチコアプロセッサを完全にロードできませんか?
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コアのバランスと使用率を観察することをお勧めします。
CPUに2つのコアがある場合は、MaxNoOfExecutionThreads = 4を設定する必要があると思います。このプロパティは、ndbdセクションで設定する必要があります。
[ndbd] MaxNoOfExecutionThreads = 2
このパラメータを2xcoresに設定する必要がある理由はわかりませんが、これは機能します