본문 바로가기
일/trouble shooting

MySQL benchmark tool DBT2 sysbench

by blair2dev 2021. 9. 4.

운영에서 이용중인 디비의 성능 측정이 필요했다.

따라서 벤치마크 툴을 설치하여 사용하기로 했다.

한번도 안해본 것이기에 진행하면서 환장할 뻔 했다. 

 

로그를 남겨가면서 진행했다.. (어디서 꼬일지 모르니..)

그 과정을 걍 복붙 해본다. 

 

요약 -> DBT2  쓰려다 sysbench 로 넘어간 이야기 ..

만약 디비 성능측정 툴을 설치하는 분이 있다면 DBT2 보다는 sysbench 를 선택하면 필자처럼 삽질은 안할 것이다. (sysbench는 10분컷이다.)

 

 

 

mySQL 성능 측정을 해보자 

 

https://jjon.tistory.com/entry/MySQL-benchmark-tool-MySQL-%EC%84%B1%EB%8A%A5-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%88%B4-DBT2

 

여기 따라하겠다

 

....

 

make 안됨

 

구글링..

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=muri1004&logNo=220617222915

make: *** 타겟이 지정되지 않았고 메이크파일이 없습니다. 멈춤.

Makefile이 있는지 확인해보자.

./configure 를 실행하면 자동으로 Makefile이 생기게 되는데 ./configure 실행을 빼먹은 것은 아닌지 확인해보자.

 

 

./configure

configure: error: 'Please choose DBMS. ./configure --with-mysql!'

 

./configure --with-mysql

configure: error: mysql_config executable not found

********************************************************************************

ERROR: cannot detect MySQL includes/libraries. If you want to compile with MySQL

       support, you must either specify file locations explicitly using

       --with-mysql-includes and --with-mysql-libs options, or make sure path to

       mysql_config is listed in your PATH environment variable.

********************************************************************************

 

./configure --with-mysql=/var/lib/mysql/

-> invalid MySQL root directory: /var/lib/mysql 

 

루트주소를 알아내자 

 

mysql 접속 후 

 

show varialbles like 'datadir';

/var/lib/mysql/ 이거 맞다네 ;; 우짜라고 

 

which mysql  치면 

-> /usr/bin/mysql/ 나오는데 

 

이것도 틀리다고 나옴 ;;

 

찾아보니 mysql-devel 을 깔아라는데 이건 뭐지 

 

*-devel packages (whether mysql or otherwise) provide the shared libraries necessary if you want to compile any other apps that require these libraries. If all you're doing is installing from your distro's package repo, then you most likely don't need to worry about the -devel packages.

무슨 라이브러리들 묶고있는 패키지 인듯?

 

yum list installed | grep mysql 

하면 community 들이 나옴

 

yum install mysql-devel

일단 깔아봄

 

/usr/bin/

/var/lib/ 둘다 여전히 root directory가 아니란다..

 

주소를 빼고 

./configure --with-mysql 

만 치니까 된다 devel 을 깔고 나서 이렇게 하니까 root 디렉토리가 자동으로 인식된듯?

 

make 도 성공한듯 

 

mysql 테스트용 계정 생성 

 

create user perf@'localhost';

역시 또 한줄만에 막힌다 ㅡㅡ 

your password does not satisfy the current policy requirments

비번 조건이 틀리단다 

create user perf@'localhost' identified by 'perfTest1';

비번을 넣어서 만들었다.

 

use mysql;

select host, user from user;

 

만들어진 계정이 보인다. 

 

grant all privileges on *.* to perf@'localhost';

풀권한 주고 

 

create user perf2@'%' identified by 'perfTest1';

perf2 만들고

 

grant all privileges on *.* to perf2@'%';

 

create user perf2@'localhost' identified by 'perfTest1';

grant all privileges on *.* to perf2@'localhost';

 

 

./scripts/mysql/mysql_load_db.sh --mysql-path /usr/bin/mysql --database dbt2 --path /root/dbPerf/dbt2-0.37.50.16/output --socket /tmp/mysql.sock --user perf --verbose

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

ERROR: rc=1

아마 sock 경로가 틀렸을 듯

 

locate mysql.sock 

/var/lib/mysql/mysql.sock 여기 이군 근데 왜 tmp 에 있는걸까 저 사람은.....?

 

mysql.sock 이 뭔지 알아야 겠다. 

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 mysql.sock이란 서버와 클라이언트 프로그램 사이에서 통신을

 

하는 유닉스 소켓파일입니다.

 

유닉스소켓 파일이 인터넷 소켓파일보다 속도가 약 30%가 빠릅니다.

 

단 유닉스 소켓파일은 동일한 서버에 있는 프로세서 통신을 합니다. 즉 유닉스소켓 파일을

 

이용해서 원격에 있는 프로세서끼리 통신은 할수없습니다. 따라서 mysql은 동일한 시스템에

 

있는 mysql에 접속하는 경우에는 mysql.sock파일을 이용하여 연결하고 외부에 있는

 

mysql에 접속할때는 일반적인 소켓파일을 이용하여 통신하게 됩니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=790626psh&logNo=40029144531

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

이렇다고 한다. 즉 로컬에서 디비 접속하기 위해 쓰는 거 인듯 

sock 경로 바꿔서 실행했다.

./scripts/mysql/mysql_load_db.sh --mysql-path /usr/bin/mysql --database dbt2 --path /root/dbPerf/dbt2-0.37.50.16/output --socket /var/lib/mysql/mysql.sock --user perf --verbose

 

ERROR 1045 (28000): Access denied for user 'perf'@'localhost' (using password: NO)

이번엔 또 권한 문제... 아까 분명 풀권한 줬는데 ..ㅡㅡ 지겹다..  

문서와는 다르게 패스워드를 설정했으니 패스위드를 넣어 줘야하나??

./scripts/mysql/mysql_load_db.sh --mysql-path /usr/bin/mysql --database dbt2 --path /root/dbPerf/dbt2-0.37.50.16/output --socket /var/lib/mysql/mysql.sock --user perf --password perfTest1 --verbose 

 

Enter password: 

ERROR 1049 (42000): Unknown database 'perfTest1'

 

아니 비번을 넣었는데.... 저건 디비 이름이 아니고 비번인데 왜 unknown database??? 

 

--password 다음에 들어가는 스트링을 디비이름으로 인식하나 봄 

 

./scripts/mysql/mysql_load_db.sh --mysql-path /usr/bin/mysql --database dbt2 --path /root/dbPerf/dbt2-0.37.50.16/output --socket /var/lib/mysql/mysql.sock --user perf --password --verbose 

이렇게 치면 퀴리 하나당 비번 하나씩 쳐야 하나보다.. 일단 진행

perfTest1

 

11번 비번 넣어주면서 쿼리 실행 하다보면 

ERROR 1193 (HY000) at line 1: Unknown system variable 'ndb_batch_size'

ERROR: rc=1

SCIRPTINTERRUPTED

 

이게 뜬다 ...

 

쉘파일 가보자....

SET_BATCH_SIZE="set ndb_batch_size=2*1024*1024;" 이런게 있는데 모르겟다

 

잘안되면 

https://brtech.tistory.com/57

이거따라 해보자

 

 

스크립트에서 SET_BATCH_SIZE 이쪽을 지웠다.  

ndb 라는게 클러스터링 해논 디비 같은데 이건 아니기도 (standalone)하고 

블로그에 나온 구문이랑 다르기도 해서 그냥 지움 

 

비번 치기 귀찮아서 testp // testtest 로 바꿈

 

그 구문은 넘어간 듯 보인다. 하지만 

 

ERROR 1290 the mysql server is running with the --secure-file-priv option so it cannot execute this statment

 

*secure_file_priv 에 설정된 경로에 있는 파일들만 입출력이 가능하다. 쉘에서 입출력하고 싶은 파일이 다른곳에 있는 것 같다. 

 

SELECT @@GLOBAL.secure_file_priv;

치면

/var/lib/mysql-files/

이게 뜬다 

 

방법은 이걸 없애주면 된다 ...

 

vi etc/my.cnf

 

secure-file-priv=""

 

systemctl restart mysqld

 

 

dbt2-0.37.50.16/output/customer.data (OS errno 13 - Permission denied)

 

권한 없다는데 chmod 777 넣어봄 

 

안됨

 

블로그 처럼 $LOCAL -> LOCAL 로 일단 해보자

 

원본 

    command_exec "$MYSQL $DB_NAME -e \"LOAD DATA $LOCAL INFILE \

              \\\"$DB_PATH/$FN.data\\\" \

              INTO TABLE $TABLE $LATIN1 FIELDS TERMINATED BY ',' ${COLUMN_NAMES} \""

 

    command_exec "$MYSQL $DB_NAME -e \"LOAD DATA LOCAL INFILE \

              \\\"$DB_PATH/$FN.data\\\" \

              INTO TABLE $TABLE $LATIN1 FIELDS TERMINATED BY ',' ${COLUMN_NAMES} \""

 

안댐 

 

./scripts/mysql/mysql_load_db.sh --mysql-path /usr/bin/mysql --database dbt2 --path /root/dbPerf/dbt2-0.37.50.16/output --socket /var/lib/mysql/mysql.sock --user testp --password  --verbose

 

 

Loading local data is disabled; this must be enabled on both the client and server sides  

이게 뜸

 

해결방법

mysql> show global variables like 'local_infile';

입력하면

 

 

이런게 보일거임

+---------------+-------+ 

| Variable_name | Value | 

+---------------+-------+ 

| local_infile  |  OFF  | 

+---------------+-------+

 

 

mysql> set global local_infile=true;

이걸 입력하면 OFF 가  ON으로 바뀐다

 

--------------

LOAD DATA LOCAL INFILE               "/root/dbPerf/dbt2-0.37.50.16/output/customer.data"               INTO TABLE customer CHARACTER SET latin1 FIELDS TERMINATED BY ','

--------------

 

ERROR 2068 (HY000) at line 1: LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

ERROR: rc=1

SCRIPT INTERRUPTED

 

 

 

 

시간이 너무 지체되는 것 같아서 sysbench 로 바꿈 

https://choelhee.tistory.com/3

 

 

 

sysbench --histogram --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sysb --mysql-password=test --mysql-db=systest --threads=1 --table-size=100 --tables=1 /usr/local/share/sysbench/oltp_read_write.lua prepare

 

https://hoing.io/archives/1867

 

 

lua script 위치 

/usr/local/share/sysbench/

 

sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=sysbench \

--mysql-password=sysbench --mysql-db=sysbench --table-size=5000000 \

--tables=5 /usr/local/share/sysbench/oltp_read_only.lua prepare

 

 

 

 

-- run

sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=sysbench --report-interval=2 \

--mysql-password=sysbench --mysql-db=sysbench --table-size=5000000 --warmup-time=30 \

--threads=4 --tables=5 /usr/local/share/sysbench/oltp_read_only.lua run

 

 

 

 

-- cleanup

sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=sysbench \

--mysql-password=sysbench --mysql-db=sysbench --threads=4 --table-size=5000000 \

--tables=5 /usr/local/share/sysbench/oltp_read_only.lua cleanup

 

파라미터를 어떻게 주고 

 

추측 -> 

스레드 : 서버 코어 수 맞춰서 

table-size (테이블 레코드 건수) : 

테이블  

max-requrest (쿼리요청 개수 ) : 

 

 

결과분석을 어떻게 할까?

 

https://jjon.tistory.com/entry/mysql-벤치-마크-툴-sysbench

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ccarlose&logNo=50171354926

 

http://intomysql.blogspot.com/2010/12/sysbench-mysql-oltp.html