在Debian上对单个MySQL查询使用多个内核


10

我正在将MySQL服务器运行在Debian作为来宾OS的VM(VMWare)上进行测试。来宾系统具有四个模拟的CPU内核,因此我将thread_concurrency设置为四个。

我正在大型表上进行昂贵的联接,这可能需要花费几分钟,但是我在客户机操作系统上看到,一次只使用一个核心。无论涉及的表使用了什么存储引擎(都已通过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 

没有其他待处理的查询。另一个有趣的发现是,如果我忽略了这一ORDER BY部分,MySQL将在一秒钟内回答此查询。

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的输出,以帮助我们诊断“整个数据库”被锁定的原因。
亚伦·布朗

谢谢,我用要求的信息更新了问题。
Thomas

1
如果没有其他查询在运行,则没有证据表明整个数据库已被锁定。您是否可以重现这种情况并发布长时间运行的查询显然将其他人拒之门外时发生的情况?
Schwartz男爵2012年

好的,我检查了一下。即使正在运行大型查询,也可以在mysql控制台中执行其他查询。但是,在执行查询时,phpmyadmin根本不响应,即使是简单的登录尝试也没有响应。执行时间本身通常少于10秒,但是查询会在“发送数据”状态下保持几分钟。
Thomas

Answers:


10

您可能会发现这很奇怪,但是应该将innodb_thread_concurrency设置为0(这是无限并发)。这将使InnoDB存储引擎可以决定要发行多少个并发票据。

我在2011年5月26日写了一篇有关InnoDB多核参与(MySQL 5.5,也是MySQL 5.1.38 InnoDB插件)的文章

根据MySQL文档,thread_concurrency变量仅适用于Solaris

我还有一个问题:您的JOIN是否涉及MyISAM和InnoDB?MyISAM的全表锁定行为使InnoDB的行级锁定和MVCC无效

如果您未使用MySQL 5.5,请尽快升级以设置InnoDB的多核参与选项

更新2012-03-19 08:30 EDT

从MySQL 5.1.38开始,您可以安装InnoDB插件以使用新设置进行多核参与。但是,您必须正确调整设置。

实际上,未配置


非常感谢你。您的答案是否暗示在5.1.X版中未实现使用多个内核?
Thomas

是和否。我说是,因为InnoDB 5.1.x没有多核设置。我说不是因为您可以为这些新设置安装InnoDB插件,但是它仅适用于MySQL 5.1.38及更高版本。
RolandoMySQLDBA 2012年

@RolandoMySQLDBA:抱歉,我知道这篇文章很旧,但是我发现我的服务器(具有24个内核)上的mysql仅使用1个内核。我检查了innodb_thread_cuncurrency您提到的,并将其设置为0,所以我想知道为什么mysql不使用更多内核?
monamona

1
@monamona这不是唯一可以使用的设置。您还必须将innodb_read_io_threads和innodb_write_io_threads设置得更高(尝试8、16、32和64)。
RolandoMySQLDBA

@monamona请阅读我的旧帖子dba.stackexchange.com/questions/2918/…了解更多详细信息
RolandoMySQLDBA 2016年

2

MySQL,任何版本,都没有任何代码可以在单个连接中使用多个内核。

Percona 在其Xtradb中跨多个连接使用多个内核方面做得更好。InnoDB耗尽了大约8个内核。Xtradb在32左右变平。

“大查询”可能锁定了某些其他连接所需的表(或表的行)。让我们看一下查询和SHOW CREATE TABLE。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.