본문 바로가기

Advanced MySQL

MySQL Limitations Part 4: One thread per connection

이번 article은 다음의 웹 페이지를 번역한 내용입니다.

<http://www.mysqlperformanceblog.com/2010/10/27/mysql-limitations-part-4-one-thread-per-connection/>


MySQL의 한계 점 - 4: 연결당 쓰레드 하나

 

 이것으로 MySQL을 사용함에 있어 심각한 한계점이 되는 부분을 다루는 세 번째 시간입니다. 이번 포스팅은 MySQL이 커넥션을 핸들링하는 방식 - 서버에 연결을 맺을 때 마다 하나의 쓰레드를 할당 하는것 - 에 대한 내용이 되겠습니다.  

 MySQL은 하나의 프로세스와 다수의 쓰레드를 사용합니다. 다른 RDBMS들도 이러한 형태로 설계되어 있는 것은 아닙니다. (어떠한 RDBMS는 여러 개의 프로세스를 사용하며, 공유메모리 등을 통해 프로세스간의 통신이 이루어 지기도 합니다. )<1> MySQL에서 커넥션을 맺는 비용은 매우 저렴합니다. 그저 쓰레드를 생성해 주기만 하면 되기 때문이지요. (혹은 캐쉬에서 하나 이용할 수도 있겠습니다.) 이 작업은 일반적으로 매우 빠르게 완료되기 때문에 다른 RDBMS에서처럼 커넥션 풀이 필요하지가 않습니다. 필요하더라도 그 구조까지 같을 필요는 없을 것입니다. <2>MS Windows의 경우 쓰레드 지원이 아주 잘 되어있으며, 앞으로도 계속 그러할 것입니다. Linux의 경우에도 이제는 쓰레드 지원이 매우 잘 되고 있습니다.

 하지만, 많은 개발 환경에서와 프로그램 언어들은 <3>커넥션 풀을 굉장히 필요로 하고 있습니다. 이러한 (자바와 같은)것들은 애초에 설계부터가 커넥션 풀을 필요로 하게끔 되어있습니다. 그리고 또 다른 많은 환경이나 언어들에서는 <4>영구 접속 방식을 기본값으로 사용하게끔 되어있어, 커넥션을 해제했을 때에도 실제로는 커넥션이 끊기지 않는 상황이 연출됩니다. 이것은 마치 커넥션 풀과도 비슷한데, 모든 커넥션 요청에 대해서가 아닌, 동일 접속에 대한 영구 접속 요청에 대해서만 적용되고 있습니다.

 커넥션 풀과 영구 접속방식이 수많은 어플리케이션 서버들과 어울러지며, 데이터베이스는 어플리케이션 서버에 대하여 엄청난 수의 커넥션을 오픈해 두고, 이 중 대부분의 커넥션에서 실제로 하고 있는 일은 없는 상태에 놓여 있을 것 입니다. 저는 1000에서 5000정도의 커넥션이 오픈되어 있는 서버임에도, 평균 하나에서 세개 정도의 커넥션만이 실제로 쿼리를 수행 중에 있는 상황들을 종종 마주치고 있습니다. 이러한 커넥션 수치는 몇 십대에서 수 백대에 이르는 어플리케이션 서버 인스턴스들에 기인한 것입니다. 만약 수없이 샤딩 되어 있는 구성이나, 수평 확장성의 어플리케이션 서버들을 가지고 있다면, 쉽게 이와 같은 어려움을 겪게 될 것이며, 이를 극복하는 것은 거의 불가능할 것입니다.

 그리고 5000개의 커넥션이 오픈되어 있다면, 서버에는 5000개의 쓰레드가 생성될 것입니다. 이로 인해 쓰레드 스케쥴링에 의한 오버헤드가 증가할 것이며, 메모리 사용량 또한 증가될 것입니다. 이러한 일이 벌어지게 되는 이유가 지금 다 생각나지 않는데, 혹시 제가 빼먹은 것이 있다면 댓글을 달아주시면 감사하겠습니다.

 이러한 문제에 대한 해법을 몇 가지 생각해낼 수 있겠지만, 그 중에서 부분 적이나마 실제로 적용된 것이 쓰레드 풀입니다. 이 기능은 MySQL 6.0을 위해 새롭게 코딩 되었는데, 지금 이미Maria DB에서 사용이 가능합니다.

 허나 안타깝게도 이것 또한 완전한 해결책이 되지는 못합니다. 이 방식은 불필요한 락-아웃이나 대기 상태를 유발하며, 멀티코어 서버에서는 확장성에 병목 현상을 일으키기 때문입니다.  마크 캘러헌씨는 쓰레드 풀에 대하여 저보다 훨씬 많은 연구를 진행하였습니다. 마크씨의 블로그 글에는 이에 대한 더욱 상세한 정보들이 있습니다. 또한 팀 쿡씨의 블로그 글 2건도 살펴 볼만 할 것입니다. (1, 2)


<1> 쓰레드와 프로세스

<2> 윈도우와 유닉스 계열의 쓰레딩 지원 차이점

<3> 커넥션 풀이란?

<4> 영구 접속 방식