Debianで単一のMySQLクエリに複数のコアを使用する


10

ゲストOSとしてDebianを使用するVM(VMWare)でテスト用のMySQLサーバーを実行しています。ゲストには4つのエミュレートされたCPUコアがあるため、thread_concurrencyを4に設定しました。

数分かかる可能性のある大きなテーブルで高価な結合を行っていますが、ゲストOSで一度に使用されるコアは1つだけです。これは、関係するテーブルに使用されているストレージエンジンに関係なく発生します(MyISAMおよびInnoDBでテスト済み)。さらに、これらの大きなクエリを実行すると、データベース全体がブロックされているように見えるため、追加のクエリを並行して実行することはできません。奇妙なことに、htopは、クエリに使用されるコアがクエリの実行中に変化することを示しています!

なぜこれが起こるのですか?

これは関連するエントリですSHOW FULL PROCESSLIST;(他のクエリはありません)。

| 153 | root       | localhost | pulse_stocks  | Query   |   50 | Copying to tmp table | 
SELECT DISTINCT * FROM 
`pulse_stocks`.`stocks` sto,
`pulse_new`.`security` sec
WHERE
(sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR
( sto.isin = sec.isin AND sto.isin <> "" AND sec.isin <> "" )
ORDER BY
sto.id
LIMIT 0, 30 

保留中の他のクエリはありません。別の興味深い所見は、MySQLがこのORDER BY部分を省略した場合、すぐにこのクエリに応答するということです。

これは何をSHOW ENGINE INNODB STATUS;示しています:

=====================================
120316  9:55:56 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 49 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 47258, signal count 47258
Mutex spin waits 0, rounds 10260, OS waits 39
RW-shared spins 94442, OS waits 47210; RW-excl spins 1, OS waits 1
------------
TRANSACTIONS
------------
Trx id counter 0 5381
Purge done for trx's n:o < 0 1810 undo n:o < 0 0
History list length 2
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 7503, OS thread id 140316748777216
MySQL thread id 154, query id 654 localhost root
SHOW ENGINE INNODB STATUS
---TRANSACTION 0 5380, ACTIVE 105 sec, process no 7503, OS thread id 140316748977920
 fetching rows, thread declared inside InnoDB 429
mysql tables in use 2, locked 0
MySQL thread id 153, query id 623 localhost root Copying to tmp table
SELECT DISTINCT * FROM 
    `pulse_stocks`.`stocks` sto,
    `pulse_new`.`security` sec
WHERE
    (sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR
    ( sto.isin = sec.isin AND sto.isin <> "" AND sec.isin <> "" )
ORDER BY
    sto.id
LIMIT 0, 30

Trx read view will not see trx with id >= 0 5381, sees < 0 5381
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
116089 OS file reads, 7 OS file writes, 7 OS fsyncs
1063.16 reads/s, 117085 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 5, seg size 7,
0 inserts, 0 merged recs, 0 merges
Hash table size 17393, node heap has 1 buffer(s)
0.00 hash searches/s, 14.73 non-hash searches/s
---
LOG
---
Log sequence number 0 38201270
Log flushed up to   0 38201270
Last checkpoint at  0 38201270
0 pending log writes, 0 pending chkp writes
10 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 20638760; in additional pool allocated 994816
Dictionary memory allocated 162680
Buffer pool size   512
Free buffers       0
Database pages     511
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 816631, created 0, written 1
7597.72 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 964 / 1000
--------------
ROW OPERATIONS
--------------
1 queries inside InnoDB, 0 queries in queue
2 read views open inside InnoDB
Main thread process no. 7503, id 140316711446272, state: waiting for server activity
Number of rows inserted 0, updated 0, deleted 0, read 160338394
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 1495933.31 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

SHOW FULL PROCESSLIST(サニタイズされている可能性があります)およびSHOW ENGINE INNODB STATUSの出力を投稿して、「データベース全体」がロックされている理由の診断に役立ててください。
アーロンブラウン

ありがとう、私は要求された情報で質問を更新しました。
トーマス

1
他のクエリが実行されていない場合、データベース全体がロックされているという証拠はありません。この状態を再現して、長期実行クエリが明らかに他のクエリをロックアウトしているときに何が起こるかを投稿できますか?
シュヴァルツ男爵2012年

わかりました、これをチェックしました。大きなクエリが実行されている場合でも、mysqlコンソールで他のクエリを実行することができます。ただし、クエリが実行されている間、phpmyadminは単純なログイン試行に対してもまったく応答しません。多くの場合、実行時間自体は10秒未満ですが、クエリは数分間「データの送信」状態のままです。
トーマス

回答:


10

これは驚くべきことかもしれませんが、innodb_thread_concurrencyを0(無限の同時実行性)に設定する必要があります。これにより、InnoDBストレージエンジンは発行する同時実行チケットの数を決定できます。

2011年5月26日に、InnoDBのマルチコアエンゲージメント(MySQL 5.5、MySQL 5.1.38 InnoDBプラグイン)について投稿しました

MySQLドキュメントによると、thread_concurrency変数はSolarisでのみ機能します。

もう1つ懸念があります。あなたのJOINにはMyISAMとInnoDBが一緒に含まれていますか?MyISAMの完全なテーブルロック動作は、InnoDBの行レベルロックとMVCCを無効にします。

MySQL 5.5を使用していない場合は、できるだけ早くアップグレードしてInnoDBのマルチコアエンゲージメントオプションをセットアップしてください

UPDATE 2012-03-19 08:30 EDT

MySQL 5.1.38以降では、InnoDBプラグインをインストールして、マルチコアエンゲージメントの新しい設定を使用できます。ただし、設定を適切に調整する必要があります。

実際、未構成のまま


どうもありがとうございました。あなたの答えは、複数のコアの使用がバージョン5.1.Xに実装されていないことを意味しますか?
トーマス

はいといいえ。InnoDB 5.1.xにはマルチコア設定がないため、「はい」と言います。これらの新しい設定用にInnoDBプラグインをインストールできるため、MySQL 5.1.38以降でのみ使用できます。
RolandoMySQLDBA 2012年

@RolandoMySQLDBA:すみません、この投稿が古いことは知っていますが、私のサーバー(24コア)のmysqlが1コアしか使用していないことがわかりました。innodb_thread_cuncurrencyあなたが言及しているように私はチェックしました、そしてそれは0に設定されているので、なぜmysqlはより多くのコアを使用しないのでしょうか?
モナモナ2016

1
@monamona遊ぶのはそれだけではありません。また、innodb_read_io_threadsおよびinnodb_write_io_threadsを高く設定する必要があります(8、16、32、および64を試してください)。
RolandoMySQLDBA 2016

@monamona 詳細については、私の古い投稿dba.stackexchange.com/questions/2918/…を参照してください
RolandoMySQLDBA '27

2

MySQLは、どのバージョンでも、単一の接続で複数のコアを使用するためのコードがありません。

Perconaは、Xtradbの複数の接続で複数のコアを使用するという優れた機能を備えています。InnoDBは約8コアで蒸気を使い果たします。Xtradbは32前後でフラットになります。

「大きなクエリ」は、他の接続に必要なテーブル(またはテーブルの行)をロックしている可能性があります。クエリとSHOW CREATE TABLEを見てみましょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.