컴퓨터잡담

Table_open_cache 가 늘어나지 않는 이유.

by 디케 posted Apr 27, 2010
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

Table_open_cache 가 늘어나지 않는 이유.


table_locks_wait 테이블_락 현상이 지속적으로 발생되어 Table_open_cache 의 수를 늘려보았지만 지정한 숫자가 아닌 임의대로 지정이 되었다.


Table_open_cache 가 max_connections 과 관련이 있다고 하여 늘이고 줄여보니 max_connections 의 숫자에 따라 Table_open_cache 가 늘어났다 줄어들었다 하는 것을 알 수 있었다.


문제는 


max_connections 의 값이 낮을수록 Table_open_cache 값이 늘어나고,

max_connections 의 값이 높을수록 Table_open_cache 값이 줄어드는 기현상이 벌어졌다.


이유가 뭘까?


해당 링크에서 답이 보이기 시작했다.


http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01_1&m_no=22536&cat1=827&cat2=965&cat3=1002&lang=k


일부내용을 발취하자면,



table_open_cache는 max_connections과 관련이 있다. 

예를 들면, 200개의 동시 구동 접속의 경우, 테이블 캐시의 크기는 최소 200 × N로 만들 수가 있는데, 여기에서N 은 여러분이 실행하는 쿼리 안에 있는 조인 (join) 당 테이블의 최대 숫자가 된다. 

여러분은 또한 반드시 임시 테이블 및 임시 파일에 대한 여분의 파일 디스크립터를 보관하고 있어야 한다. 여러분은 지금 사용하고 있는 OS가 table_open_cache 설정에 포함되어 있는 오픈 파일 디스크립터의 숫자를 다룰 수 있는지를 확인해야 한다. 만일 table_open_cache가 너무 크다면, MySQL은 파일 디스크립터 오류를  발생 시킨 후에 쿼리를 실행하지 못하며, 또한 매우 불안정하게 된다. 또한,  MyISAM 스토리지 엔진은 서로 다른 오픈 테이블별로 두 개의 파일 디스크립터를 필요로 한다는 점을 알고 있어야 한다. mysqld의 스타트 업 옵션인 --open-files-limit를 사용하면 MySQL에서 사용 가능한 파일 디스크립터의 숫자를 늘릴 수가 있다.


파일 오픈용 캐시는 table_open_cache 엔트리 레벨에서 관리된다. 디폴트 값은 64이다; 이 값은 --table_cache 옵션으로 변경 시킬 수가 있다. MySQL은 쿼리를 실행하기 위한 것 보다 많은 수의 테이블을 임시로 오픈 한다는 점을 알아두자.

 



파일 디스크립터?

mysqld의 스타트 업 옵션인 --open-files-limit를 사용하면 MySQL에서 사용 가능한 파일 디스크립터의 숫자를 늘릴 수가 있다?

뭐지? 



참고로 나의 서버에는 open-files-limit가 2048로 되어 있다.



MySQL은 아래의 환경이 되면 사용되지 않은 테이블을 닫고 캐시에서 삭제해 버린다:

캐시가 가득 차고 쓰레드가 캐시 안에 없는 테이블을 열고자 시도할 경우.

캐시가 table_open_cache 엔트리에 있는 것 보다 많은 것을 가지고 있고 캐시 안에 있는 테이블이 더 이상 어떠한 쓰레드에 의해서도 사용되지 않을 경우.

테이블 플러싱 연산이 발생될 경우. 이것은 누군가가 FLUSH TABLES 명령문을 입력하거나,  mysqladmin flush-tables 또는 mysqladmin refresh 명령어를 실행할 때.

테이블 캐시가 가득 차게 되면, 서버는 사용할 캐시 엔트리를 저장하기 위해서 아래의 과정을 진행한다:


사용 중에 있지 않는 테이블은 풀어 놓는다.

만일 오픈해야 할 테이블이 필요하기는 하지만 캐시가 가득 찾기 때문에 풀어 놓을 테이블이 없게 된다면, 캐시는 필요한 만큼 임시로 확장이 된다.

캐시가 임시로 확장이 되고 테이블이 사용되지 않는 상태가 되면, 테이블은 닫히고 캐시에서 풀어져 나오게 된다. 




흠,,

하단까지 읽어보았으나, 내서버는 Opend_tables 가 0이다.

아직 내서버에 나타나는 증상은 해결할 수 없다. ㅠ.ㅠ