데비안에서 단일 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.