1. 쿼리와 테이블 구조
slow query log에 기록되는 쿼리를 수정한다. 또 인덱스도 적절하게 작성한다.
JOIN 이나 GROUP BY 등으로 임시 테이블을 사용하는 빈도를 낮춘다.
2. 쿼리 캐쉬 사용
같은 SELECT문이 실행된다면 효과가 기대된다.
3. 바이너리 로그 파일등은 별도의 디스크에 보존
I/O를 분산처리한다.
4. prealloc영역
한개의 스레드로 많은 쿼리를 처리해야하는 경우 사용할 수 있는 변수이다.
쿼리 해석등에 사용하는 메모리는 그 때마다 할당되고 해제되지만 prealloc변수는 미리 할당한 영역을 해제하지 않고 그 다음 처리에도 사용한다. prealloc변수에는 다음과 같은 것이 있다.
query_prealloc_size
transaction_prealloc_size
5. 메모리 처리량에 주의
sort_buffer_size , join_buffer_size, read_buffer_size, read_rnd_buffer_size 를 늘리면
쿼리의 처리가 빨라질 수 있지만 너무 많이 늘리게 되면 메모리가 부족하게 되므로 조심해야한다. ( 이것들은 스레드단위로 메모리가 할당된다. )
6. 스레드 캐쉬, Listen
접속이나 절단이 많은 경우는 thread_cache_size를 늘려서 재이용할 수 있는 스레드 수를 확보한다. MySQL은 접속이 있을 때마다 자식 스레드를 작성하고 절단할 때에 그 자식 스레드를 파기한다. 이것을 몇개정도는 파기하지 않고 새로운 접속에 준비에 둘까하는 것을 지정하는 것이 thread_cache_size이다. 또, back_log로 Listen의 수를 늘려두면 접속반응이 좋아진다.
7. 테이블 핸들러의 확보
동시접속수가 많은 경우, 한번에 사용할 수 있는 테이블 핸들러의 최대수를 table_cache 지정으로 늘린다. 모든 클라이언트가 사용할 정도의 테이블 수만큼 확보해두면 낫지않을지 싶다. 이것이 적을 경우 테이블 핸들러의 close, open이 증가한다. MySQL설정예에서는 1024, 2048등이 사용되고 있다.
2010년 2월 25일 목요일
2010년 1월 31일 일요일
MySQL - 모니터링8
- NOOP : 단순한 FIFO(First In/First Out) 이다. I/O스케줄러의 큐에 순서대로 I/O 요청이 저장되어 처리된다.
- Deadline: I/O 요청의 순서를 바꿈으로 I/O 퍼포먼스 향상을 목표로 한다. READ와 WRITE용으로 각각 큐를 가지고 있어 큐는 두개의 리스트로 관리된다. 큐 시간으로 소트된 것과 섹터 개시위치로 소트된 것이다. FIFO 리스트에 있는 최초의 요청이 READ로는 500msec, WRITE로는 5sec이상 기다리게 되면 그 큐를 우선적으로 처리한다.
- Anticipatory: READ 요청의 처리 마지막에 다음의 요청이 지금과 가까운 위치에서의 처리를 수행할 것인가를 확인한다. ( 지금 처리한 근처로의 액세스가 있는 것을 기대해서) 만약 가깝다면 곧 그 요청을 dispatch한다. 디스크 헤드가 한개밖에 없는 것을 전제로 하고 있다.
- CFQ(Completely Fair Queuing): 모든 I/O요청이 공평하게 처리될 것을 목적으로 하고 있다. 프로세스 단위, 프로세스 그룹 단위, 유저 단위로 처리가 공평하게 이루어지도록 한다. 요청의 발신지 모두에 대해서 각각 고유의 큐를 준비한다 이 큐를 라운드로빈으로 처리한다.
라벨:
anticipatory,
cfq,
deadline,
noop
2009년 12월 27일 일요일
MySQL - 모니터링7
Linux커널의 I/O스케줄러 변경
커널2.6에서는 다음처럼 I/O스케줄러를 변경할 수 있다.
커널2.6에서는 다음처럼 I/O스케줄러를 변경할 수 있다.
#I/O스케줄러의 변경
root@shell# echo "anticipatory" > /sys/block/sda/queue/scheduler
하드디스크단위로 지정한다.
하드디스크의 인식명에 따라서 위 예의 sda부분이 바뀌게 된다.
또 boot할 때 커널의 파라미터에 디폴트 I/O스케줄러를 부여하는 것이 가능하다.
elevator=deadline
/sys/block/디스크명/queue/iosched/ 아래의 파일로 I/O스케줄러의 파라미터를 변경할 수 있다.
I/O스케줄러에는 다음과 같은 것이 있다. 커널의 config시에 디폴트를 지정할 수 있다.
- Anticipatory
- Deadline
- CTQ
- NOOP
커널의 config의 변수, CONFIG_DEFAULT_IOSCHED이던지 make config의 메뉴의
「Block layer」→ 「IO Schedulers」→ 「Default I/O scheduler」에 값을 부여한다.
2009년 12월 21일 월요일
MySQL - 모니터링6
운영체제 툴
oprofile의 데이터는 /var/lib/oprofile/에 기록된다.
MySQL본체이외에도 운영체제의 상태를 알고 싶을 때가 있을 것이다.
여기에서는 Linux를 기준으로 몇가지 툴과 수법을 소개해보자.
iostat
iostat는 디스크 드라이브 단위로 I/O통계정보를 얻을 수 있는 명령어이다. 구문은 다음과 같다.
iostat [옵션] [간격 [횟수] ]
간격에 초수를 지정하면 지정 초수마다 횟수에 지정된 횟수만큼 iostat를 실행하고 끝낸다.
이 때 최초의 레포트는 지금까지의 누적정보를 내고, 두번째부터는 전 레포트 보고시점부터의 통계를 나타낸다. 횟수를 지정하지 않으면 영원히 레포트를 출력한다 .
vmstat
vmstat는 VM의 통계정보를 얻을 수 있는 명령어이다. 구문은 다음과 같다.
vmstat [옵션] [간격 [횟수] ]
간격에 초수를 지정하면 초수마다 횟수에 지정된 횟수만큼 vmstat를 실행하고 끝낸다.
횟수를 지정하지 않으면 영원히 레포트를 출력한다
Linux프로파일러( oprofile)
어플리케이션 어느 부분이 어느 정도의 처리를 하고 있는지등의 정보를 얻을 수 있다.
oprofile에서 프로파일링을 하기 위해서는 커널이 oprofile을 지원하고 있을 필요가 있다.
커널의 config변수는 다음과 같다.
CONFIG_PROFILING 「y」
CONFIG_OPROFILE 「y」또는 「m」
커널의 config의 menu에서는 다음 항목을 유효로 해둔다.
Instrumentation Support -> Profiling support를 「y」
OProfile system profiling을 「y」또는 「m」
실제 조작은 다음과 같다.
oprofile실행예
opcontrol --shutdown <-- oprofile데몬 정지
opcontrol --reset <-- oprofile의 과거 데이터를 삭제
opcontrol --start <-- oprofile 데몬 기동
조사하고 싶은 명령어를 실행
opcontrol --shutdown <-- oprofile데몬 정지
opcontrol --save=test01 <-- 방금 취득한 데이터를 test01라는 이름으로 백업
opcontrol -1 session:test01 <-- test01의 레포트를 표시
oprofile의 데이터는 /var/lib/oprofile/에 기록된다.
피드 구독하기:
글 (Atom)
