1. QPS와 TPS란?
- 데이터베이스 성능 테스트, 모니터링, 실제 비즈니스 데이터베이스 부하를 이해할 때 가장 중요한 두 가지 성능 지표가 있습니다.
- 바로 QPS(Queries Per Second)와 TPS(Transactions Per Second)입니다.
- QPS: 초당 처리되는 쿼리 수를 의미합니다
- TPS: 초당 처리되는 트랜잭션 수를 의미합니다
정보
이 두 지표는 데이터베이스의 처리 능력과 현재 부하 상태를 파악하는 핵심 메트릭으로, 올바른 계산 방법을 알고 있어야 정확한 성능 분석이 가능합니다.
2. QPS 계산 방법
2.1 QPS 정의와 혼란
- QPS는 "Queries-per-second"의 줄임말로 초당 쿼리 처리율을 의미합니다.
- 하지만 실제로는 계산 방법에 대해 여러 가지 해석이 존재합니다.
- 여러 가지 해석이 존재하는 이유는 QPS의 Q(Query)가 무엇을 의미하는지에 대한 혼란 때문입니다.
- 이번 글에서는 QPS의 Q(Query)가 무엇을 의미하는지에 대한 명확한 정의와 계산 방법을 알아보겠습니다.
2.2 QPS 계산 방법 비교
- MySQL를 예시로 QPS를 계산하는 방법에 대해서 세 가지 방법을 소개합니다.
2.2.1 방법 1: DQL(Select)만 계산
- QPS의 Q(Query)를 "쿼리"로 이해하고, 이를 DQL(Data Query Language)로 해석하여 SELECT 문만을 대상으로 하는 방법입니다.
- 읽기 작업만 측정되며, 쓰기 작업이 없으면 QPS가 0이 되는 비합리적인 결과를 초래할 수 있습니다.
- 이 방법은 QPS의 정의를 너무 제한적으로 해석한 잘못된 방법입니다.
- 실제 운영 환경에서는 사용하지 않는 것이 좋습니다.
정보
DQL(Data Query Language)은 데이터베이스에서 데이터를 조회하는 데 사용되는 SQL 명령어로, SELECT문이 있습니다. SQL은 용도에 따라 DQL(조회), DDL(구조정의), DML(데이터조작), DCL(권한관리)로 분류됩니다.
2.2.2 방법 2: Queries 상태값 사용
- QPS의 Q(Query)를 "쿼리"로 해석하되, DQL에 국한하지 않고 모든 SQL 문을 포함하는 방법입니다.
- 실제로 Q는 넓은 개념으로 해석되어야 합니다.
- SQL이 무엇인지 생각해보면, SQL = DQL + DML + DDL + DCL이므로, QPS의 Q도 SQL의 Q와 마찬가지로 일반화된 Query, 즉 모든 SQL 문을 의미해야 합니다.
- 그렇다면 MySQL 데이터베이스 서버에서 모든 SQL 문의 총 개수를 어떻게 얻을 수 있을까요?
- MySQL에서는
SHOW GLOBAL STATUS LIKE 'Queries'명령을 통해 이를 확인할 수 있습니다. - 해당 명령을 통해 QPS를 계산하는 방법은 다음과 같습니다.
- MySQL에서는
-- 현재 Queries 값 확인
SHOW
GLOBAL STATUS LIKE 'Queries';
-- t초 후 다시 확인하여 차이값을 t로 나누어 계산
QPS
= (Queries_after - Queries_before) / t
- Queries 카운트는 서버에서 실행된 문장의 수를 나타냅니다.
- 서버에서 실행된 모든 문장의 수를 카운트합니다.
- Questions 카운트와 달리 이 변수는 저장 프로시저에서 실행된 문장도 포함합니다.
- COM_PING이나 COM_STATISTICS 명령은 카운트하지 않습니다.
- 따라서 두 번째 방법의 계산 방식은 SHOW GLOBAL STATUS LIKE 'Queries'를 실행하고, t초 후에 다시 SHOW GLOBAL STATUS LIKE 'Queries'를 실행하여 이전과 이후의 Queries 수의 차이를 t초로 나누어 Queries-per-second를 계산하는 것입니다.
2.2.3 방법 3: Questions 상태값 사용 (권장)
- 방법 3의 계산 방법은 방법 2와 유사하지만,
SHOW GLOBAL STATUS LIKE 'Queries'를SHOW GLOBAL STATUS LIKE 'Questions'로 수정한 점이 다릅니다. - 그렇다면 Questions는 무엇을 의미할까요? MySQL 공식 문서의 설명은 다음과 같습니다.
- Questions는 서버에서 실행된 문장의 수를 나타내지만, Queries 변수와 달리 클라이언트가 서버로 보낸 문장만 포함하고 저장 프로그램 내에서 실행된 문장은 포함하지 않습니다.
- 또한 COM_PING, COM_STATISTICS, COM_STMT_PREPARE, COM_STMT_CLOSE, COM_STMT_RESET 명령은 카운트하지 않습니다.
-- 현재 Questions 값 확인
SHOW
GLOBAL STATUS LIKE 'Questions';
-- t초 후 다시 확인하여 계산
QPS
= (Questions_after - Questions_before) / t
- Questions 상태값의 특징:
- 클라이언트가 서버로 보낸 문장만 카운트
- 저장 프로시저 내부 문장은 제외
- Prepared Statement 관련 명령들도 제외
2.3 Queries vs Questions 차이점
| 구분 | Queries | Questions | 비고 |
|---|---|---|---|
| 저장 프로시저 | 포함 | 제외 | 내부 저장 문장, 비텍스트 SQL 상호작용 |
| COM_STMT_PREPARE | 포함 | 제외 | Prepared statements |
| COM_STMT_CLOSE | 포함 | 제외 | Prepared statements |
| COM_STMT_RESET | 포함 | 제외 | Prepared statements |
- Queries가 더 많은 통계를 카운트하기 때문에, 이론적으로 Queries 카운트는 항상 Questions 카운트보다 크거나 같습니다.
- 일반적인 비즈니스 환경에서는 저장 프로시저와 Prepared Statement를 거의 사용하지 않으므로, 두 방법의 결과는 거의 동일합니다.
- 하지만 더 정확한 클라이언트 요청 기반 QPS를 원한다면 Questions을 사용하는 것을 권장합니다.