##################################
## mysql 에서 file open caching ##
##################################
mysql 이 성능향상을 위해서 캐싱하는 것중 열려진 파일의 핸들이 있다.
요청이 있을때 파일을 열고, 요청이 끝나도 바로 닫지 않고 파일의 핸들을 캐시에 올려둔다.
이러한 파일에는 테이블의 데이타파일, 인덱스파일 그리고 로그파일들이 해당된다.
대부분의 OS 에서는 이 파일핸들들은 모든 쓰레드에서 공유된다.
(* 파일핸들을 공유안시키고 테이블파일을 열 수도 있다. HANDLE table_name OPEN 을 참고하세요.)
mysql 은 table_cache 라는 설정변수로 캐시크기를 정할수 있다.
table 하나당 인덱스,데이타파일 2개가 열리므로, 실제 열리는 파일개수는 table_cache*2 이다.
만약, 이 값이상으로 테이블을 열게 되면 mysql은 주어진 알고리듬(lru)에 의해 옛날 파일핸들을 닫게 된다.
혹은 FLUSH TABLES, mysqladmin refresh , mysqladmin flush-tables 명령으로 사용자가 직접 캐시에 있는 파일을 닫을 수 있다.
table 캐싱의 효과는 특별한 지표가 정해져있지는 않지만 다음과 같은 지표로 판단할 수 있을 것이다.
Opened_tables / Questions : 쿼리당 여는 테이블 수.
위의 값이 충분히 작아지도록 table_cache 값을 크게 하면된다.
그러나, 캐싱의 성능을 극대화한다고 이값을 마냥 크게 잡을 수 는 없다.
대부분의 OS 는 프로세스당 열수 있는 파일 개수의 최대값을 정해놓기 때문에(여기에는 소켓도 포함된다),
table_cache 값이 지나치게 크면, cpu 는 놀아도 파일핸들이 없어서 요청을 처리하지 못하는 경우가 생길수도 있다.
흔한 경우는 아니지만 mysql 에러파일에서 \(errno: 23)\ 혹은 \(errno: 24)\ 같은 메세지를 보게 되면
사용가능한 파일핸들이 없다는 것이므로, table_cache 가 지나치게 크게 잡혔나 살펴보아야 한다.
그럼 table_cache 값을 정하는 방법을 살펴보자.
( 프로세스당 열 수 있는 파일수 - 최대접속수(max_connection) - (temporary table 에 사용되는 파일핸들) ) / 2
실제적인 경우를 예로 들어보자.
내가 쓰고 있는 리눅스 머신에서는 프로세스당 열 수 있는 파일수가 8192 로 되어 있다.
사양은 다음과 같다.
CPU : celeron 366, Mem : 64M
경험적으로 mysql 커넥션을 아무리 많이 잡아도 1,000 개 이상 처리하지 못할 것이다.
그리고, temporary table 에 사용되는 파일핸들을 많이 고려해도 한 100개
따라서, table_cache 값은 4046 으로 정할 수 있다.
대개의 경우 table 수는 4000 개를 넘지 않으므로 100% 캐싱된다.
지금까지 table 캐싱의 의미와, 정하는 방법을 살펴보았다.
그러나, 실제 table 캐싱과 성능향상과의 관계는 경험해볼 기회가 없었다.
예상으로는 인덱스파일 캐싱만큼은 효과가 없을 것 같다.
실험을 한다면 table_cache 값을 0 혹은 1정도로 했을때와, 충분히 크게 했을경우 각각 성능을 측정해보면
되지 않을까 생각된다.
* 참고사이트
http://www.mysql.com/information/presentations/presentation-oscon2000-20000719/index.html
http://www.mysql.com/doc/T/a/Table_cache.html
http://www.mysql.com/doc/N/o/Not_enough_file_handles.html
http://www.mysql.com/doc/H/A/HANDLER.html
|