2014년 1월 24일 금요일

high_performance_mysql_3rd_edition 벤치마크

주의사항
1.실제와 동일한 데이터 사용
2.변수 쿼리 사용
3.벤치 마킹 후 로깅 확인(에러 일 경우)
4.시스템이 웜된상태에서 시작
5.너무 빠른 시간에 하지 말것

벤치마크 계획
1.문제와 골을 정함
2.데이터 베이스 스냅샷을 떠서 다시 할때 동일조건으로 할수있게
3.로깅에 남은 실제 쿼리를 가져다가 벤치 마크(1일~ 1주등)-멀티 쓰레드로
4.얼마나 해야 되는가?
잘모르면 스테이블 해질때까지 무작정 돌림
5.오랜시간 하지 않을꺼면 그냥 다른 사람들 결과를 확인 하는게 좋을 수도 있음
6.벤치 마크를 할대마다 폴더를 만들고 아무 로우 데이터를 다 집어 넣어라
*나중에 문제 생기면 로우 데이터가 짱이다
7.스크립트를 짜서 돌린다.
#!/bin/sh
INTERVAL=5
PREFIX=$INTERVAL-sec-status
RUNFILE=/home/benchmarks/running
mysql -e 'SHOW GLOBAL VARIABLES' >> mysql-variables
while test -e $RUNFILE; do
file=$(date +%F_%I)
sleep=$(date +%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")
sleep $sleep
ts="$(date +"TS %s.%N %F %T")"
loadavg="$(uptime)"
echo "$ts $loadavg" >> $PREFIX-${file}-status
mysql -e 'SHOW GLOBAL STATUS' >> $PREFIX-${file}-status &
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
mysql -e 'SHOW ENGINE INNODB STATUS\G' >> $PREFIX-${file}-innodbstatus &
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
mysql -e 'SHOW FULL PROCESSLIST\G' >> $PREFIX-${file}-processlist &
echo $ts
done
echo Exiting because $RUNFILE does not exist.
8.OS에서 다른잡이 도는지 안도는지 꼭확인해라
9.네트워크 트래픽도 확인해라
10.벤치마킹을 자동화 하라
11.결과값을 모으는 스크립트도 자동화 하라
#!/bin/sh
# This script converts SHOW GLOBAL STATUS into a tabulated format, one line
# per sample in the input, with the metrics divided by the time elapsed
# between samples.
awk '
BEGIN {
printf "#ts date time load QPS";
fmt = " %.2f";
}
/^TS/ { # The timestamp lines begin with TS.
ts = substr($2, 1, index($2, ".") - 1);
load = NF - 2;
diff = ts - prev_ts;
prev_ts = ts;
printf "\n%s %s %s %s", ts, $3, $4, substr($load, 1, length($load)-1);
}
/Queries/ {
printf fmt, ($2-Queries)/diff;
Queries=$2
}
' "$@"
12.평균치는 결과를 뭉떵그리기때문에 시간별 그래프를 만들어라
ex)gnuplot