MySQL 5.6.36 & Threadpool Fix

http://worklog.askmonty.org/worklog/Server-BackLog/?tid=246
MariaDB 쪽 쓰레드풀 개발 백로그 문서를 보면 오라클이 구현한 쓰레드풀의 단점에 대해서 기록되어있고 acceptor 쓰레드의 블락킹 문제가 언급되어 있음

Comparison with MySQL enterprise threadpool
===========================================
Here are the downsides of Oracle’s implementation.
– MySQL/Oracle is using efficient epoll() on Linux and inefficient poll()
everywhere else.
– Client login. Login just blocks the acceptor thread, and network IO is done
synchronously, which means slow client will prevent logons of other clients.
클라이언트 로그인. 로그인이 acceptor 쓰레드를 블락함, 그리고 네트워크 IO 가 싱크방식으로 완료됨, 이는 느린 클라이언트가 다른 클라이언트들의 로그인을 막게 됨
– wait_timeout does not work with MySQL Enterprise threadpool.
– KILL seems to have a high overhead and require careful locking due to
inefficient implementation.

https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-36.html
이번 5.6.36 업데이트 에서 쓰레드풀의 acceptor 쓰레드 부분에서 변경이 있는 것으로 보이며 읽기쓰기 워크로드가 들어오는 마스터에서 Threadpool 사용시 로그인할때 심각한 지연을 경험했던 바 테스트가 필요할 것으로 보임

쓰레드 풀//
쓰레드풀 플러그인 퍼포먼스 향상을 위해 커넥션 인증authentication과 초기화initialization 부분이 acceptor 쓰레드에서 클라이언트 커넥션을 핸들링하는 쓰레드풀 worker 쓰레드로 이동되어 짐
acceptor 쓰레드가 감소된 레이턴시로 더 높은 rate 에서 새 커넥션을 핸들링하게 해 줌
커넥션 인증과 초기화에 대해 진행하거나 대기하고 있는 쓰레드의 숫자를 INFORMATION_SCHEMA.TP_THREAD_GROUP_STATE 테이블에 추가된 CONNECT_THREAD_COUNT 컬럼에서 알 수 있음
쓰레드 그룹에서 최대 4개의 worker 쓰레드가 존재할 수 있고; 이 쓰레드들은 얼마간의 미사용 기간이 지나면 만료됨 (Bug #17159742)

그밖의 관심가는 5.6.36 버그 픽스//
– InnoDB: restart 시 st_my_thread_var 구조체를 초기화시키는 백그라운드 쓰레드를 위한 my_thread_init() 와 my_thread_exit() functions 누락으로 server exit 이 발생되었던 것을 픽스 (Bug #25167032)

– InnoDB: row_search_mvcc() function 이 레코드가 트랜잭션 읽기 뷰에 없을 때 range query 에서 불필요하게 전체 테이블을 스캔하는 경우가 있었던 것을 픽스 (Bug #84202, Bug #23481444, Bug #25251375)

– mysqldump 가 덤프를 쓸때 올바르게 어떤 식별자identifiers 에 quote 를 달지 못하는 오류 픽스 (Bug #25717383)

https://bugs.mysql.com/bug.php?id=78777 픽스 후 발생한 사이드이펙트로 P_S 을 쓰지 않을 때 Query state 가 NULL 로 보여지는 문제에 대한 픽스 (Bug #25309017, Bug #84305) https://bugs.mysql.com/bug.php?id=84305

– libmysqlclient 에 링크된 client 가 prepared statement 사용 동안 잘못된 메모리 엑세스를 발생될 수 있었던 문제 픽스 (Bug #25164932)

– WHERE 절에 dependent subquery 가 있는 쿼리에서 테이블이 셀렉트리스트에 있는 컬럼과 서브쿼리에 사용되는 컬럼이 복합으로 구성된 세컨더리 인덱스가 있을 때, GROUP BY 또는 DISTINCT 쿼리가 Loose Index Scan (플랜상 Using index for group-by 로 표기) 을 사용하게 되어 쿼리가 잘못된 결과를 생산할 수 있었던 문제 픽스 https://bugs.mysql.com/bug.php?id=83005

– DISTINCT 와 집계aggregate 함수를 사용하는 쿼리가 잘못된 결과를 생산할 수 있었던 문제 픽스 (Bug #22686994, Bug #80310) https://bugs.mysql.com/bug.php?id=80310

– 빈로그포맷 statement 일 때 서버사이드 prepared statement (useServerPrepStmts=true) 사용 시 빈로그에 fractional part 가 드랍되어 기록됨, 마스터에서는 round 되고 슬레이브에서는 truncate 되어 데이터가 들어가 데이터 정합성이 맞지 않게 되는 문제 픽스 서버사이드 prepared statment 미사용시 timestamp 의 fractional part 가 유지되어 기록됨 (Bug #74550, Bug #19894382, Bug #25187670) https://bugs.mysql.com/bug.php?id=74550

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중