데비안에서 단일 MySQL 쿼리에 여러 코어 사용


10

게스트 OS로 Debian을 사용하여 VM (VMWare)에서 테스트하기 위해 MySQL 서버를 실행하고 있습니다. 게스트에는 4 개의 에뮬레이트 된 CPU 코어가 있으므로 thread_concurrency를 4로 설정했습니다.

몇 분이 걸릴 수있는 큰 테이블에서 값 비싼 조인을 수행하고 있지만 게스트 OS에서는 한 번에 하나의 코어 만 사용됩니다. 이것은 관련된 테이블에 사용 된 스토리지 엔진에 관계없이 발생합니다 (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의 출력을 게시하십시오.
Aaron Brown

감사합니다. 요청한 정보로 질문을 업데이트했습니다.
Thomas

1
다른 쿼리가 실행되고 있지 않으면 전체 데이터베이스가 잠겨 있다는 증거가 없습니다. 이 조건을 재현하고 장기 실행 쿼리가 다른 쿼리를 명백히 잠글 때 발생하는 상황을 게시 할 수 있습니까?
Baron Schwartz

좋아, 나는 이것을 조사했다. 큰 쿼리가 실행되는 경우에도 mysql 콘솔에서 다른 쿼리를 수행 할 수 있습니다. 그러나 phpmyadmin은 쿼리가 실행되는 동안 간단한 로그인 시도에도 전혀 응답하지 않습니다. 실행 시간 자체는 종종 10 초 미만이지만 쿼리는 몇 분 동안 "데이터 전송"상태로 유지됩니다.
Thomas

답변:


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 2014 년

@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

2

모든 버전의 MySQL에는 단일 연결 에서 여러 코어를 사용하는 코드가 없습니다 .

Percona는 Xtradb의 여러 연결에서 여러 코어를 더 잘 사용합니다 . InnoDB는 약 8 코어에서 증기가 부족합니다. Xtradb는 32 정도에서 평평 해집니다.

"큰 쿼리"는 다른 연결에 필요한 테이블 (또는 테이블 행)을 잠글 수 있습니다. 쿼리와 SHOW CREATE TABLE을 보자.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.