Perché il cluster mysql non utilizza più core della CPU?

Ho un problema con il process ndbmtd. Quando utilizzo la configuration successiva mi aspetto che entrambi i core sul nostro server con Intel (R) Pentium (R) CPU G6950 @ 2.80GHz saranno completamente utilizzati. Purtroppo questo non sta accadendo. Viene utilizzato solo il core con id = 0. La seconda non ha alcun carico.

La mia configuration:

  • MySQL estremamente lento su query molto semplici SELECT
  • come risolvere il problema utilizzando rsyslog per l'output a un database mysql
  • Ripristina completamente l'authentication del server mysql
  • Crea utenti tramite Puppet leggendo una tabella mySQL
  • Ho caduto accidentalmente il mysql db
  • Permettere i diritti di accesso a un'istanza MySQL basata sul nome host anziché sull'indirizzo IP?
  • [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 

    Tuttavia, "top" mostra l'utilizzo del 90% per il process ndbmtd (perché?)

    La mia topologia – 2 nodes dati, ndb_mgmt in VM, mysqld in VM.

    La mia CPU non è capace di tale cosa, ho qualcosa che non è configurato o il cluster mysql non è in grado di caricare completamente i processri multi-core?

  • Come utilizzare la maggior parte della memory disponibile su MySQL
  • Mysql Esport la configuration corrente in un file
  • Modo più veloce per spostare più database su un nuovo server
  • Configurazione Good / Better per MySQL su un'ampia istanza EC2
  • Aggiunta di una nuova unità su un server di database Linux
  • Eseguire MySQL in un contenitore Docker
  • 2 Solutions collect form web for “Perché il cluster mysql non utilizza più core della CPU?”

    Ho fatto il check-in con il team di sviluppo di MySQL Cluster e Frazer Clement ha fornito questa risposta dettagliata. Facci sapere come va il tuo test. Un buon posto per fare domande specifiche a MySQL Cluster è il forum: forums.mysql.com/list.php?25

    Quella CPU non ha hyperthreading

    Così ha 2 corpi reali.

    Secondo questo: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-programs-ndbmtd.html , il MaxNoOfExecutionThreads dovrebbe essere impostato su 2 per un host a 2 core.

    Dichiara inoltre che quando impostato su 2, ci saranno:

     1 local query handler (LQH) thread 1 transaction coordinator (TC) thread 1 transporter thread 1 subscription manager (SUMA) thread 

    Con il ndbd normale, tutte queste funzioni sono in un thread, con ndbmtd e MaxNoOfExecutionThreads = 2, sono divise come mostrato. Si noti che si tratta di una suddivisione "funzionale": each thread ha un ruolo diverso e richiede quindi una quantità diversa di CPU per svolgere la propria parte del lavoro. Per un dato throughput, la quantità di CPU consumata da ciascun tipo di thread sarà diversa.

    Valori più alti di MaxNoOfExecutionThreads aumenteranno il numero di thread LQH, che devono assumere ciascuna una quota uguale del lavoro 'LQH' e essere bilanciati l'uno rispetto all'altro. Tuttavia, gli altri thread avranno diverse quantità di consumo di CPU.

    Infine, la linea LockExecuteThreadToCpu = 0,1 viene utilizzata da ndbmtd in una sorta di stile round-robin. Purtroppo, ci sono troppi thread di esecuzione (4) per il numero di CPU fornite per dare un equilibrio equilibrato. Quindi cosa succede è che il singolo thread LQH sia dotato di una CPU e gli altri tre thread condividono l'altra CPU. Ciò può rappresentare lo squilibrio visto.

    Si noti che la mapping di thread a cpus viene inviata nello stdout (ndb_out log) di each process ndbmtd quando si avvia. Usando configuration simile, vedo quanto segue:

    NDBMT: num_threads = 4

    Installazione di DBSPJ instanceNo = 0

    Blocca threadId = 3936 per CPU ID = 0

    Blocca threadId = 3935 per CPU ID = 0

    Bloccare threadId = 3937 alla CPU id = 0

    AVVERTENZA: Troppe CPU sono specificate con LockExecuteThreadToCPU. Solo 2 specificati, ma 4 erano necessari, questo potrebbe causare contestazione.

    L'assegnazione di thread LQH a CPU dedicata e altri thread condividerà la restante 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)

    (0) DBMANN (0) DBUM (0) DBUM (0) DBUM (0) DBUM (0) DBUM (0) DBUM (0) DBTQ (0) DBMANN (0) DBINFO (0) PGMAN (5)

    : 0 tid: 3938 cpu: 1 OK DBTC (0) DBDB (0) DBDB (0) DBDIT (0) DBDB (0) DBDIT (0) DBDIT (0) DDBPN (0)

    Possiamo vedere che un thread di esecuzione (3940) è bloccato alla CPU 0 e gli altri sono bloccati alla CPU 1. 3940 è un thread di lavoratore LQH (poiché ha un block DBLQH con un numero> 0 (DBLQH (1))) .

    I CMVMI (ricevitore di networking IO), i thread DBLQH (0) / SUMA (0) e DBTC (0) sono tutti bloccati alla CPU 1 in questo esame.

    Quindi, a seconda del traffico utilizzato, la quantità di CPU consumata sulla CPU 0 vs CPU1 sarà fuori bilancio. Si noti che i thread di "manutenzione" sono anche bloccati alla CPU 0 che, se la CPU 0 è satura, può rendere le cose peggiori.

    Se il collo di bottiglia per questo tipo di traffico è l'elaborazione LQH, aumentando MaxNoOfExecutionThreads a 4 o superiore, si verificheranno due lavoratori LQH, ciascuno dei quali sarà assegnato un nucleo. Tuttavia, gli altri thread utilizzeranno anche uno dei core, che limiterà le risorse del lavoratore LQH su quel nucleo.

    Se i lavoratori LQH non sono il collo di bottiglia, quindi avere lavoratori extra LQH può ridurre la CPU disponibile per altri thread e ridurre il throughput.

    Raccommand di sperimentare il carico di traffico, controllando l'output ndbmtd per comprendere la mapping, misurando il throughput e la latenza raggiungibili, nonché osservando l'equilibrio e l'utilizzo dei core CPU.

    Penso che dovresti impostare MaxNoOfExecutionThreads = 4 quando hai 2 core nella CPU, questa properties; dovrebbe essere impostata in sezione ndbd

    [ndbd] MaxNoOfExecutionThreads = 2

    Non so perché dovresti impostare questo parametro 2xcores, ma questo funziona

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.