MySQL 튜닝 -- MySQL




mysql> show status;

- Aborted_clients : 클라이언트 프로그램이 비정상적으로 종료된 수
- Aborted_connects : MySQL서버에 접속이 실패된 수
- Max_used_connections : 최대로 동시에 접속한 수
- Threads_cached : Thread Cache의 Thread 수
- Threads_connected : 현재 연결된 Thread 수
- Threads_created : 접속을 위해 생성된 Thread 수
- Threads_running : Sleeping 되어 있지 않은 Thread 수


mysql> show variables like '%max_connections%';

- max_connections : 최대 동시접속 가능 수


mysql> show variables like '%wait_timeout%'

- innodb_lock_wait_timeout : 종료 전까지 요청이 없이 기다리는 시간 (TCP/IP 연결, Shell 상의 접속이 아닌 경우)


mysql> show variables like '%thread%';

- thread_cache_size : thread 재사용을 위한 Thread Cache 수로써, Cache 에 있는 Thread 수보다 접속이 많으면 새롭게 Thread를 생성한다.


Cache Miss Rate(%) =  Threads_created / Connections * 100

 mysql> show status like '%thread%';
 mysql> show status like '%connect%';

 1.08% = 753 / 69671 * 100
 1.1% = 11 / 962 * 100

Connection Miss Rate(%) = Aborted_connects / Connections * 100

 mysql> show status like '%connect%';

 0.02% = 14 / 69671 * 100

Connection Usage(%) = Threads_connected / max_connections * 100

 mysql> show status like '%thread%';
 mysql> show variables like '%connect%';
 
 7.28% = 11 / 151 * 100
 2% = 4 / 200 * 100


튜닝1

Connection Usage(%)가 100% 라면 max_connections 수를 증가하기 바랍니다. Connection 수가 부족할 경우 Too Many Connection Error 가 발생합니다. DB 서버의 접속이 많은 경우는 wait_timeout 을 최대한 적게 (10~20 정도를 추천) 설정하여 불필요한 연결을 빨리 정리하는 것이 좋습니다.


그러나 Connection Miss Rate(%) 가 1% 이상이 된다면 wait_timeout 을 좀 더 길게 잡는 것이 좋습니다. Cache Miss Rate(%) 가 높다면 thread_cache_size를 기본값인 8 보다 높게 설정하는 것이 좋습니다. 일반적으로 threads_connected 가 Peak-time 시 보다 약간 낮은 수치로 설정하는 것이 좋습니다. 


MySQL서버는 외부로부터 접속 요청을 받을 경우 인증을 위해 IP 주소를 호스트네임으로 바꾸는 과정을 수행하여 접속 시에 불필요한 부하가 발생하게 됩니다. skip-name-resolve를 설정하시고 접속 시에 IP 기반으로 접속을 하게 되면 hostname lookup 과정을 생략하게 되어 좀 더 빠르게 접속을 하실 수 있습니다.



튜닝2 (메모리)

mysql> show status like '%key%';

- key_block_unused : Key Cache에서 사용되고 있지 않은 Block 수
- key_reads : Key Block 읽기 요청 시 Disk를 읽은 수
- key_read_requests : Key Block 읽기 요청 수


mysql> show variables like '%key%';

- key_buffer_size : 인덱스를 메모리에 저장하는 버퍼의 크기
- table_cache : 전체 스레드가 사용할 오픈 가능한 테이블 수
- myisam_sort_buffer_size : 테이블 repair,Alter table,load data에 사용되는 버퍼 메모리 크기
- join_buffer_size : 조인을 위한 메모리 버퍼 크기
- record_buffer : 순차적인 검색을 위해 사용되는 메모리 버퍼 크기
- record_rnd_buffer : order by 절을 사용할 경우 디스크 사용을 피하기 위하여 사용하는 메모리 버퍼 크기
- sort_buffer : order by 와 group by에 사용되는 메모리 버퍼 크기
- tmp_table_size : group by 시 디스크를 사용하지 않고 임시 테이블을 만들기 위해 사용되는 메모리 크기
- key_cache_block_size : block 의 크기(bytes, 기본값 1024)


Key Buffer Usage = 1 - ((Key_blocks_unused × key_cache_block_size) / key_buffer_size)

 mysql> show status like '%key%';
 mysql> show variables like '%key%';
 
 0.211 = 1 - ((307095 * 1024) / 402653184)
 0.189 = 1 - ((850422 * 1024) /  1073741824)
 
Key_reads/Key_read_requests Rate(%) =  Key_reads/Key_read_requests * 100

 mysql> show status like '%key%';

  15% = 207265/1374958 * 100
  17% = 9709 / 54200 * 100
  2699 / 12898 * 100
  
 
Key_reads/Key_read_requests Relative Rate(%) = (1- ^Key_reads/^Key_read_requests) * 100
* ^Key_Reads = Current Key_Rreads - Previous Key_Reads

 = 1 - 8455/



튜닝3


key_buffer_size는 총 메모리 크기의 25% 정도의 크기로 설정하는 것이 좋습니다. Key_reads/Key_read_requests Rate(%)은 일반적으로 1%보다 적습니다. 1% 보다 높다면 Key Cache가 아닌 디스크를 읽은 경우가 많다고 판단할 수 있습니다.


또한 Key_reads/Key_reads_requests Relative Rate(%) 값이 지속적으로 90% 이상일 경우는 key_buffer_size가 효율적으로 설정되어 있다고 생각하시면 됩니다. 하지만 데이터베이스가 엄청나게 크거나 여러 데이터를 골고루 많이 읽는 데이터베이스라면 아무리 많은 양의 키 캐시를 설정해도 90% 이상의 적중률을 얻을 수는 없습니다.

[www@smson www]$ vi /etc/my.cnf 
# The MySQL server
[mysqld]
skip-name-resolve
key_buffer_size = 1024M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache = 8
query_cache_size= 16M
wait_timeout = 120


출처 : http://lonmoon.tistory.com/324


덧글

  • 구독자 2018/12/12 16:35 # 삭제 답글

    게시글 보고 정말 많은 도움을 받아갑니다. 감사합니다
    한가지 여쭤보고 싶은게 'key_buffer_size는 총 메모리 크기의 25% 정도의 크기'라고 언급해주셨는데
    시스템 총메모리의 25%인가요? DB에 할당되는 총메모리 크기의 25%인가요?
  • 어린왕자 2018/12/16 17:45 # 답글

    예전 글이라 조심스럽긴 합니다만 과거 4/8기가 물리 메모리 크기에서의 25%로 기억하고 있습니다. key_buffer_size는 인덱스된 블록을 메모리에 기록하기 위한 최대값으로 사용되므로 이 크기를 넘어서게 되면 디스크에서 읽어야 하므로 속도면에서 이득을 보기 어렵다는 것이 요점입니다.
댓글 입력 영역



20140817_300_250

통계 위젯 (화이트)

6177
1073
1039938