본문 바로가기

MySQL/Performance

[긴급] Mysql Connection Full 발생!!

안녕하세요 간만에 글을 올립니다.

시간상으로는 mysql 의 log라던지 Replication, my.cnf Setting등이 먼저 와야할듯하지만, 이번에 발생한 히얀한(?) 현상에 대해서 정의를 내릴까합니다.

우선 mysql은 최초 대몬을 띄우면 데몬 자체가 여러개의 데몬을 뛰워서 커넥션에 대해서 충분히 받아 드릴 준비를 합니다. 물론 하나만으로 충붕하다면 더이상 데몬을 띄우지는 않습니다. 그리고 각 클라이언트는 mysql에 접속해서 Connection을 맺습니다. 이를 통해서 통신이 이루워지면 이는 클라이언트에서 close()를 하지 않은 이상 wait Timeout의 시간동안 연결이 보장됩니다.

흠.. 순식간에 여러가지 말들이 나왔습니다. 데몬(응?)이라던지 close()라던지 Wait Timeout ....

사실 앞에 두개는 다들 아실꺼라 믿고 생략을 합니다. 문제는 wait time인데요 이는 클라이언트에서 Query가 서버측으로 마지막으로 보낸 시간을 기준으로 다음 query가 올때까지의 대기시간을 설정하는 겁니다. (my.cnf or 'show variables like '%timeout%' 참고)
허나 이값은 초기에 무지 긴 값을 가지고 있습니다. 디폴트 값은 무려 28800입니다. 단위는 당연히 초(s) 입니다. 그럼 이를 환산하면 무려 8시간이나 되는것이지요(맞나요 대충계산해다능 ㅠ.ㅠ)

그럼 찬찬히 생각을 해보면 많은 클라이어트 특히나 웹서버나 ODBC를 이용한 다른 Tool을 제공하는 서버의 경우에는 커넥션을 맺고 이를 close()를 하지 않고 다음 구문이나 다음 page로 넘어갈경우 어떻게 될까요 네~ 당연히 8시간동안 connection은 유지되는 것이지요

그럼 잠시 위의 내용을 갈무리하고 다른 설정을 살펴 보도록 합니다. 대상은 바로바로바로
max connection 입니다. 영문이지만 어떤의미인지는 대충 감이 오죠? 네 맞습니다. 클라이언트의 최대 접속 량을 제한하는 설정입니다.

즉, 정리를 하면 Connection이 이루어진 후 close을 하지 않고 대량으로 신규 connection을 진행하면 언젠가 max connection에 도달할것이고 이는 정해진 wait timeout에 도달 할때까지 신규 connection을 만들지 못합니다.


자~ 그럼 어떻게 할까요? 후훗.. 그야 당연히 max connection을 엄청 늘린다고 생각한 당신은 욕쉼쟁이 후후훗... 그럼 안되죵 ^^; 왜냐믄 물런 많아진 connection에 도달 할때까지는 괜찮겠지만 그 수까지 초과해버린다면 역시 동일한 상황에 도달하게됩니다.
그럼 어떻게 해야할까요 ^^; 네~ 당연히 프로그래머들과 상의를 해야합니다. 최근에 작성한 문서에서 close문을 추가하지 않은 부분이 있는지 꼼꼼히 체크하고 DBA는 어떠한 계정에서 동일한 문제가 발생하는지 봐야겠지요 ^^

허나 이번에 발생한 문제의 원인은 당췌 알수가 없었습니다. 도대체 왜? Way? 머땀시?? (왜그냐구 형힘든데 ㅠㅠ. Orz) 그래서 우선 마련한 대책은
 
shell을 이용해서 동일한 ip에서 유저가 접속하면 자동으로 connectioin을 kill하도록 만들어뒀습니다.

허나 이를 등록하게된다면 실제로 접속하고 있는 멀쩡한 connection을 kill하는 사태가 발생할 수 있습죠!! 그럼 어떻게 할까 고민을 하다가 8시간 단위 혹은 10시간단위로 kill script를 돌릴까 생각해봣습니다. 네~ 아직은 생각만한거구요 정확한 원인은 계속해서 분석중에 있습니다.

kill script라는 다소 위험하고 과감한 방식을 선택하긴했으나 나머지 유력한 용의자도 몇분이 계십니다. 정리를 하면 아래와 같죠 ^^

1. ODBC의 DATASource에서 커넥션 자체를 close하지 않는 경우
2. Web page source어디에선가 close를 하지 않아서 발생하는 문제

네~ 2번은 아까 위에서 말씀드린부분이고 현재 1번의 경우에서 발생하는 문제일지도 모른다고 생각해서 찾아보고 있는중이지만 초큼 난해해서 kill process의 등록을 심각히 고려해보고있는 현상입니다.

문제가 100% 해결되면 다음 글로 설명을 드리도록 할께요 그럼~ 전 구글형님에게 안부를 전하러 쿠쿠쿠 ^^

'MySQL > Performance' 카테고리의 다른 글

표시형식 이라고 들어보셨나요?  (1) 2009.08.06