2. DBMS이야기/02. MySQL

MySQL에서 mysqlslap을 활용하여 쿼리 성능을 측정하는 방법 (3) - 활용사례

OSSW(Open Source System SoftWare 2014. 11. 19. 17:16

이번 글에서는 mysqlslap을 사용한 사례를 소개합니다.

사용 사례 : 자동 생성 된 SQL 및 데이터와 벤치마킹

우리는 mysqlslap의 자동 생성-SQL 기능을 사용하여 시작합니다. 우리는 자동 생성 된 SQL을 사용하는 경우, mysqlslap는 별도의 임시 데이터베이스를 작성합니다 - 적절라는 mysqlslap을. 이 데이터베이스는 하나의 정수 및 샘플 데이터로 채워 하나의 VARCHAR 타입 컬럼과의 간단한 테이블을해야합니다. 이 데이터베이스 서버의 전체 성능을 확인하는 빠르고 쉬운 방법이 될 수 있습니다.


우리는 자동으로 생성 된 SQL이 한 번 일을 하나의 클라이언트 연결을 테스트하여 시작합니다

sudo mysqlslap --user=sysadmin --password --host=localhost  --auto-generate-sql --verbose
Benchmark
        Average number of seconds to run all queries: 0.009 seconds
        Minimum number of seconds to run all queries: 0.009 seconds
        Maximum number of seconds to run all queries: 0.009 seconds
        Number of clients running queries: 1
        Average number of queries per client: 0

출력에 표시되는 mysqlslap 몇 벤치마킹 통계를보고합니다. 그것은 평균, 최소를보고하고 초 최대 IT는 쿼리를 실행했다. 또한,이 부하 시험에 사용 클라이언트 연결의 수가 하나라고 볼 수있다.


이제 50 개의 동시 연결을 시도하고, 자동 생성 된 쿼리 실행을 10 배를 가지고 :

sudo mysqlslap --user=sysadmin --password --host=localhost  --concurrency=50 --iterations=10 --auto-generate-sql --verbose
이것이 의미하는 것은 명령 오십 시뮬레이션 클라이언트 연결마다 동시에 동일한 테스트 쿼리를 발생하며,이 시험은 10 회 반복 될 것이다.

출력은 우리에게 부하 증가와 현저한 차이를 보여줍니다
Benchmark
        Average number of seconds to run all queries: 0.197 seconds
        Minimum number of seconds to run all queries: 0.168 seconds
        Maximum number of seconds to run all queries: 0.399 seconds
        Number of clients running queries: 50
        Average number of queries per client: 0
필드 이제 클라이언트 당 질의 평균 수가 0 (50)의 값을 보이고있습니다 : 질의를 실행하는 클라이언트들의 개수가 어떻게 참고합니다.

자동 생성 된 SQL은 두 개의 필드와 간단한 테이블을 작성합니다. 대부분의 생산 환경에서 테이블 구조보다 훨씬 더 큰 것입니다. 우리는 테스트 테이블에 추가 필드를 추가하여이 에뮬레이션 mysqlslap 지시 할 수있다. 이를 위해, 우리는 두 개의 새로운 매개 변수를 사용할 수있다 : 숯 COLS---number과 --number-INT-COLS. 이들 파라미터는 VARCHAR의 번호를 지정하고 테스트 테이블에 추가 열 유형 값 int.
다음 예제에서, 우리는 5 숫자 열 20 문자 유형 열이있는 테이블에 대해 실행되는 자동 생성 SQL 쿼리와 함께 테스트. 우리는 또한 50 클라이언트 연결을 시뮬레이션하고 우리는 100 번 반복하는 테스트 :
sudo mysqlslap --user=sysadmin --password --host=localhost  --concurrency=50 --iterations=100 --number-int-cols=5 --number-char-cols=20 --auto-generate-sql --verbose
이 사람이 조금해야합니다. 테스트가 실행되는 동안, 우리는 우리가 MySQL의 세션 실행을 가지고 무슨 일이 일어나고 있는지 볼 수있는 다른 터미널 윈도우로 전환 할 수 있습니다. 시간이 초과하는 경우, 테스트가 완료하고 테스트 데이터베이스를 볼 수 없습니다 있습니다.
MySQL의 프롬프트에서 :
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| employees          |
| mysql              |
| mysqlslap          |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)
당신은 당신이 원하는 경우 테스트 데이터베이스에서 테이블을 확인할 수 있습니다; 그것은 T1라고.

다시 다른 터미널 창을 확인합니다. 테스트가 완료되면, 당신은 성능이 더욱 증가 된 부하 둔화 것을 찾을 수 있습니다 :

Benchmark
        Average number of seconds to run all queries: 0.695 seconds
        Minimum number of seconds to run all queries: 0.627 seconds
        Maximum number of seconds to run all queries: 1.442 seconds
        Number of clients running queries: 50
        Average number of queries per client: 0
다시 MySQL의 터미널 세션에 이동합니다. 우리는 mysqlslap가 버리는 데이터베이스 떨어졌다 볼 수 있습니다.MySQL의 프롬프트에서 :
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| employees          |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
사용 예제: Custom 쿼리들로 벤치마킹.
서버의 물리적 자원을 평가하는 경우 자동 생성 된 SQL이 좋다. 당신이 주어진 시스템이 취할 수있는 부하의 수준을 발견 할 때 매우 유용합니다.

특정 데이터베이스에 종속 응용 프로그램의 성능 문제를 해결하려는 경우 그러나, 당신은 실제 데이터에 실제 쿼리를 테스트 할 수 있습니다. 이러한 쿼리는 웹 또는 응용 프로그램 서버에서 오는 될 수 있습니다.

지금, 우리는 당신이 테스트하려는 특정 쿼리를 알고 있다고 가정합니다. 다음 절에서 우리는 당신에게 당신의 서버에서 실행중인 쿼리를 찾을 수있는 방법을 보여 드리죠.

우리는 인라인 쿼리를 시작합니다. 당신은 --query 옵션 mysqlslap하는 인라인 쿼리를 제공 할 수 있습니다.SQL 문은 그들에 줄 바꿈을 할 수 없습니다, 그들은 세미콜론으로 구분해야합니다 ().쿼리는 큰 따옴표로 묶어야합니다.
다음 코드에서 우리는 deptemp 테이블에 대해 간단한 쿼리를 실행하고 있습니다.`deptemp` 테이블 만 명 이상의 기록을 가지고있다. 우리가 --create-스키마 옵션을 사용하여 직원 데이터베이스를 지정하는 방법을 참고 :
sudo mysqlslap --user=sysadmin --password --host=localhost  --concurrency=50 --iterations=10 --create-schema=employees --query="SELECT * FROM dept_emp;" --verbose
이것은 실행하는 데 시간이 걸릴 것입니다. 당신은 2 분 후이 같은 성능 벤치 마크를 받아야한다 :

Benchmark
        Average number of seconds to run all queries: 18.486 seconds
        Minimum number of seconds to run all queries: 15.590 seconds
        Maximum number of seconds to run all queries: 28.381 seconds
        Number of clients running queries: 50
        Average number of queries per client: 1
다음으로, 우리는 --query 매개 변수에 여러 SQL 문을 사용합니다. 다음의 예에서 우리는 세미콜론으로 각 쿼리를 종료한다. mysqlslap 우리가 --delimiter 옵션을 지정했기 때문에 우리가 별도의 SQL 명령의 번호를 사용하는 알고 :
sudo mysqlslap --user=sysadmin --password --host=localhost  --concurrency=20 --iterations=10 --create-schema=employees --query="SELECT * FROM employees;SELECT * FROM titles;SELECT * FROM dept_emp;SELECT * FROM dept_manager;SELECT * FROM departments;" --delimiter=";" --verbose
이 테스트는 연결 수와 동일한 반복 동일한 번호를 사용한다. 그러나 성능은 여러 SELECT 문 (23.8 초 대 18.486 초 평균)에 대한 점진적으로 느립니다 :
Benchmark
        Average number of seconds to run all queries: 23.800 seconds
        Minimum number of seconds to run all queries: 22.751 seconds
        Maximum number of seconds to run all queries: 26.788 seconds
        Number of clients running queries: 20
        Average number of queries per client: 5
생산 SQL 문은 복잡 할 수 있습니다. 이 시험을 위해 그것을 입력하는 것보다 스크립트에 복잡한 SQL 문을 추가하는 것이 더 쉽습니다. 그래서, 우리는 스크립트 파일에서 쿼리를 읽을 mysqlslap을 지시 할 수 있습니다.

이를 설명하기 위해 SQL 명령에서 스크립트 파일을 만들 수 있습니다. 우리는 이러한 파일을 만들려면 아래의 코드를 사용할 수 있습니다 :
sudo echo "SELECT * FROM employees;SELECT * FROM titles;SELECT * FROM dept_emp;SELECT * FROM dept_manager;SELECT * FROM departments;" > ~/select_query.sql

sudo cp ~/select_query.sql /mysqlslap_tutorial/
select_query.sql 파일은 이제 다섯 SELECT 문을 보유하고있다.

이 스크립트는 여러 쿼리를 가지고 있기 때문에, 우리는 새로운 테스트 개념을 도입 할 수 있습니다. mysqlslap는 쿼리를 병렬화 할 수 있습니다. 우리는 각각의 테스트 클라이언트 실행해야 할 쿼리 수를 지정하여이 작업을 수행 할 수 있습니다. mysqlslap는 --number - 중 - 쿼리 옵션을 사용하여이 작업을 수행합니다. 우리가 실행하는 50 개 1000 쿼리가 경우에 따라서, 각각의 클라이언트는 약 20 쿼리를 각각 실행합니다.

마지막으로, 우리는 또한 우리가 사용하는 컴퓨팅 자원의 표시를 줄 것이다 --debug-정보 스위치를 사용할 수 있습니다.

다음 코드에서, 우리는 우리가 방금 만든 스크립트 파일을 사용하는 mysqlslap을 요구하고있다. 우리는 또한 수 - 중 - 쿼리 매개 변수를 지정합니다. 이 과정을 두 번 반복됩니다 우리는 출력에서 디버깅 정보를 원하는 :
sudo mysqlslap --user=sysadmin --password --host=localhost  --concurrency=20 --number-of-queries=1000 --create-schema=employees --query="/mysqlslap_tutorial/select_query.sql" --delimiter=";" --verbose --iterations=2 --debug-info
이 명령이 완료되면, 우리는 몇 가지 흥미로운 결과를 볼 수 있습니다 :
Benchmark
        Average number of seconds to run all queries: 217.151 seconds
        Minimum number of seconds to run all queries: 213.368 seconds
        Maximum number of seconds to run all queries: 220.934 seconds
        Number of clients running queries: 20
        Average number of queries per client: 50


User time 58.16, System time 18.31
Maximum resident set size 909008, Integral resident set size 0
Non-physical pagefaults 2353672, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 102785, Involuntary context switches 43
여기에 우리의 MySQL의 인스턴스의 모든 쿼리를 실행할 수있는 시간 (초) 평균 217 초 거의 사분입니다. 그는 확실히 우리의 가상 머신에 RAM 및 사용 가능한 CPU의 양에 의해 영향을받는 동안, 그것은 또한 두 번 반복 클라이언트 연결의 적당한 수의 쿼리의 많은 때문.

우리는 비 물리적 페이지 결함 다수 볼 수 있었다. 데이터가 메모리에있는 시스템이 가서 디스크에 스왑 파일에서 그것을 가져가 할 수없는 경우 페이지 오류 발생.출력은 CPU 관련 정보를 나타낸다. 이 경우에 우리는 컨텍스트 스위치의 다수를 참조.

BY LEE JI EUN