2014년 1월 24일 금요일

high_performance_mysql_3rd_edition 서버퍼포먼스

퍼포먼스
1.하나의 작업을 완료한 시간으로 측정
퍼포먼스는 응답시간이다

옵티마이징
1.하나의 작업 시간을 최소한으로 걸리게 함

잘못된 생각
속도를 위해  리소스 소비를 키울수도 있다

원칙
1.퍼포먼스는 응답시간이다
응답시간을 줄이기 위해서는 쿼리 처리 도중 어디에서 부하가 걸리는지 확인 하는것
2.내가 측정 할수 없는걸 옵티마이징 할수 없다.
3.옵티마이징 자체가 중요한게 아니라 쿼리가 어느부분에 지체 되는지 확인이 중요
옵티마이징 시간의 90%이상을 이부분에 사용
작업시간이 적게 걸리는 일은 튜닝 할필요가없다.(튜닝도 조금 밖에 안되기 때문)

프로파일링?
프로 파일링 이란 어디서 시간이 소비 되는지 분석 하는 작업이다.
1.작업을 측정하고
2.걸리는 시간을 측정한다.
3.정보를 분석해서 문제를 찾아낸다.

작업 시간 순으로 정리한 후 오래 걸린 순으로 정렬한다.

시간이 걸리는데는 크게 2가지로 생각 할수 있다.
1.실행 시간 자체가 긴것
2.오래 기다려서 느린것

프로파일링 툴의 한계점
1.어떤 쿼리를 튜닝하는게 효과적인지 알려주지 않는다.
슬로우 쿼리라고 꼭 튜닝 해야 하는건 아니다
가장 많은 영향력을 가진 쿼리를 선별해서 튜닝해야 된다.
2.lost time 이 있을 경우 확인 하라
실제 실행시간 - 프로파일러에 측정된 시간  = lost time
당신이 어떤 부분을 측정 하지 않고 있다는 뜻
3.평균을 신용하지 말라
반은 정말 빠르게 실행되고 반은 절망 느리게 실했된다면?
잘못된 정보를 습득하게된다.
4.한계의 쿼리는 상황에 따라 느리거나 빠를수 있다

어플리케이션 프로파일링
리스판스가 느릴때는 데이터베이스가 보틀넥일수도 있지만
다른대일수도 있다
1.외부 자원접근
call web service or search engine
2.많은 시간을 소모 하는 작업
ex) parsing big XML file
3.비싼 작업
ex) req expression
4.잘못된 알고리즘

어플리케이션을 만들때 프로파일링 코드를 삽입해라
물런 프로파일링 코드가 오버해드를 읽으킬수 있지만
그결과로 옵티마이징 할때 얻는 이익이 더 크다(라고 저자는 주장)
*전부 다하지 기록 하지 말고 랜덤으로 뽑아서 해라

PHP 일때
xhprof.php 좋단다(xdebug, valgr)

MySQL Enterprise Moniter 좋단다. 기획쪽 참고하기위해 한번 보자

프로파일링 Mysql queries
방법은 2가지가 있다.
1.전체 서버를 프로파일링 하여 어떤 쿼리가 가장 많은 load 가 걸리는지 확인 하는거

Mysql queries 의 슬로우 쿼리를 로그로 저장하는 방법
long_query_time 을 on 함으로서 슬로어 쿼리에 시간을 추가 할수 있다.
slow query 는 오버해드가 거의 없기 때문에 늘 켜놓고
로그를 순환으로 만들어라 A,B,C 를 순환하면서 쓰게(아니면 디스크를 꽉채운다)
C:\ProgramData\MySQL\MySQL Server 5.5\my.ini

log-output = FILE//로그를 파일에 쓰겠다 * 테이블도 가능
general-log = ON
general-log-file = gen.log
long_query_time = 0 //(10~1) 0으로 하게 되면 모두찍음
slow_query_log_file = slow.log
slow_query_log = ON
event-scheduler = ON //이벤트 스케쥴러 사용여부 default off
log-queries-not-using-indexes<--요런 놈도 있음

로그파일
C:\ProgramData\MySQL\MySQL Server 5.5\data에서 확인가능
물론 테이블에 적게 할수도있지만 퍼포먼스 많이 떨어진다.(로깅과 비교해 약 1000배)

쿼리를 서버에 적지 못할때 사용하는 방법
1.pt-query-digettool에서 지속적으로
SHOW FULL PROCESSLIST 를 호출하여 쿼리가 있으면 시작 사라지면 걸리시간 측정 하는것
connection 단위로 리스트에 나타
하나의 컨넥션에서는 당연이 하나의 쿼리만 execute 가능함
2.TCP network 트래픽을 저장하는 방법
tcpdump -> pt-querydigest --type=tcpdump

pt-querydigert 보는방법
Rank

QueryId
쿼리를 이름을 해시값으로 만든것
(literl value remove, remove white space, all lower case)

response

Item
정규화된 이름
V/M varince -to -mean ratio (분산 평균 비율)
V/M = 분산x분산/평균
값이 클수록 차이가 많이 나는 애임으로 튜닝 하기 좋은 후보