2010년 3월 18일 목요일

MySQL를 snmpd로 감시1

서버의 상태를 정보수집하는 경우, SNMP가 잘 사용된다. 관리업무에 사용되는 SNMP클라이언트 툴로서는 MRTG가 유명하다.

MRTG에서 mysqladmin 명령어나 mysql명령어를 실행해서 정보수집하는 방법도 있지만 이것은 다음과 같은 점에서 좋지 않는 면도 있다.

  • mysqladmin명령어나 mysql명령어를 실행하기위해 클라이언트가 되는 MRTG가 있는 머신과 MySQL서버간의 통신이 허용되는 케이스가 적다.
  • 힘들여 MySQL서버가 움직이는 컴퓨터에 SNMP서버를 돌리게 했는데도 그것과는 다른 별도의 방법으로 MySQL서버 정보를 취득하는 것도 거시기하다.
[클라이언트] [서버]
SNMP클라이언트 -------------------------------->SNMP서버(->mysql명령->MySQL서버)

SNMP서버가 MySQL정보를 보내주는 것이 가능하다면 간단하게 해결될 것이다.

여기에서는 Linux 2.6과 net-snmp 5.1.2를 사용해서 설명한다. 물론 ucd-snmp계열이라면 통용되는 이야기가 된다.
또, Debian GNU/Linux 3.1 sarge에서는 다음과 같이 조작하는 것으로 SNMP서버와 클라이언트 양쪽이 인스톨된다.

Debian패키지 인스톨
root@shell# aptitude install snmp snmpd




2010년 3월 7일 일요일

튜닝을 위한 팁(InnoDB)

1.데이터 파일, REDO로그 파일을 별도의 디스크에 보존
innodb_data_file_path, innodb_log_group_home_dir

파일을 물리적으로 다른 디스크에 배치함으로 I/O처리를 분산 시킬 수 있다.

2.데이터 파일은 autoextend로 하지 않기
innodb_data_file_path

자동확장을 수행하지않게 함으로 I/O처리를 줄인다.

3. 데이터파일은 2개 이상으로 한다.
innodb_data_file_path

테이블 영역을 구성하는 데이터 파일이 1개면 성능이 나오지 않는다. 데이터 파일을 여러개로 하자.

4. 캐쉬
innodb_buffer_pool_size, innodb_log_buffer_size, innodb_additional_mem_pool_size

기본값은 보통은 작다. 이것들은 공유메모리이다.
innodb_buffer_pool_size는 레코드나 인덱스의 캐쉬등에 사용되므로 가능한한 크게 설정한다.
innodb_additional_mem_pool_size는 데이터 사전등의 보존을 위해서 사용되지만 20MB정도로 할당한다.

5. 한개의 트랜잭션의 크기를 고려해서 REDO로그 파일의 크기나 버퍼의 크기를 결정한다.
innodb_log_buffer_size, innodb_log_file_size, innodb_log_files_in_group

너무 작으면 디스크에 써넣는 횟수가 많아지게 된다. 또 innodb_log_file_size * innodb_log_files_in_group * 70%를 넘는 정도의 써넣기가 buffer pool에서 이루어지면 체크포인트가 수행되어져 버린다. innodb_buffer_pool_size이외에도 REDO로그를 고려해야한다.
기본값에서는 보통 작다.

6. innodb_doublewrite를 무효로 한다.

장애에 잘 견디기 위해서 2개의 장소에 데이터를 써넣기를 하고 있다. ( 기본값은 innodb_doublewrite = ON ) 이것을 무효로 한다. ( --skip-innodb-doublewrite )

7. innodb_max_dirty_pages_pct

InnoDB의 buffer pool중에 innodb_max_dirty_pages_pct(%)가 dirty한 부분인 경우, 체크포인트가 수행된다. buffer pool을 크게 할 수 없는 경우 , 이 값을 크게 해서 조금이나마 체크포인트를 지연시키는 방법도 있다.
그러나 이 값을 변경하는 것보다 innodb_buffer_pool_size의 값이나 innodb_log_file_size * innodb_log_files_in_group의 값을 늘리는 게 효과적이다.

8. innodb_thread_concurrency
InnoDB의 처리를 수행하는 스레드 수를 지정한다. 너무 많이 늘려놓으면 반대로 스레드 사이에 기다리는 시간이 늘어나게 된다. 이것은 운영체제의 SMP나 스레드의 구현에도 영향받게되므로 어떤 운영체제에서는 잘 돌아갔던 설정값이더라도 다른 운영체제에서는 성능이 나오지않는 경우도 있을 수 있다. 4,8,16 정도의 값으로 시도해본다.

9. flush
innodb_flush_method, innodb_flush_log_at_trx_commit

flush방법, 타이밍을 지정한다. 대부분의 경우 innodb_flush_method를 O_DSYNC로 변경한다. 또 innodb_flush_log_at_trx_commit은 기본(COMMIT할 때 flush하기 )값으로 운용하는게 많다.

2010년 3월 3일 수요일

튜닝을 위한 팁(MyISAM)

1.캐쉬

key_buffer_size, preload_buffer_size등의 캐쉬를 수정해 본다. key_buffer_size는 되도록이면 많이 할당한다. 이것은 공유메모리이다. 메모리가 충분히 있다면 myisam_use_mmap를 사용해서 모든 MyISAM테이블을 메모리에 매핑하는 것도 검토해 본다.

2.데이터 테이블, 인덱스 파일을 별도의 디스크에 보존한다.

I/O의 분산처리에 도움이 된다. CREATE TABLE문장에 DATA DICTIONARY, INDEX DICTIONARY를 지정하면 MYD파일, MYI파일의 보존 디렉토리를 변경할 수 있다.

3.써넣기하지 않는 테이블은 압축

써넣기가 없는 테이블은 "myisampack -v 테이블명", "myisamchk -rq 테이블"를 실행해서 테이블을 압축한다. 압축하면 파일사이즈도 작게되고 그로인해 디스크로부터 읽어들이는 양도 줄어 들게 되므로 경우에 따라서는 속도향상도 기대된다.