2010년 4월 6일 화요일

MySQL를 snmpd로 감시2

Linux의 net-snmp(ucd-snmp)에서는 snmpd.conf를 고쳐서 필요한 프로그램(명령어나 스크립트)의 실행결과를 snmpd(SNMP서버)에 건네는 것이 가능하다.

이것을 수행하기 위해서는 snmpd.conf에 exec키워드나 pass 키워드를 사용해서 실행하는 명령어를 지정한다. exec도 pass도 실행되는 명령어는 결과를 표준출력에 출력하는 것이 전제조건이다. ( 다시 말해 snmpd의 입장에서 보면 명령실행결과는 표준입력으로 얻는다는 것을 알 수 있다. )

exec와 pass의 차이는 다음과 같다.

  • exec: 여러행에 걸쳐서 문자열을 리턴하는 경우에 편리. 리턴값의 타입은 STRING으로 고정
  • pass: 리턴값의 타입을 STRING이외로 하고 싶은 경우에 사용. snmpd에 건네는 결과에는 exec보다도 고민이 필요하다.

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 테이블"를 실행해서 테이블을 압축한다. 압축하면 파일사이즈도 작게되고 그로인해 디스크로부터 읽어들이는 양도 줄어 들게 되므로 경우에 따라서는 속도향상도 기대된다.