기초공부 - (11) QPS & TPS

2024. 4. 16. 23:25MySQL/Class

반응형

1. 정의
(1) QPS (Queries Per Second)
일반적인 관점에서 초당 특정 엔티티가 수행한 원자 동작의 수를 가리킨다. 더 제한된 관점에서 이 용어는 DBMS 벤더와 사용자 공동체가 초당 데이터베이스 트랜잭션의 수를 가리키기 위해 사용되는 것이 보통이다.
 
(2) TPS (Transactions Per Second)
초당 트랜잭션 수(transactions per second, TPS)는 일반적인 관점에서 초당 특정 엔티티가 수행한 원자 동작의 수를 가리킨다. 더 제한된 관점에서 이 용어는 DBMS 벤더와 사용자 공동체가 초당 데이터베이스 트랜잭션의 수를 가리키기 위해 사용되는 것이 보통이다.
 
위 내용은 위키에서 가져온 내용입니다. 다소 난해한 내용이라 생각됩니다.
쉽게 설명을 드리자면, QPS 는 1초당 얼마나 쿼리가 발생되었는지를 확인하는 수치이며, TPS 는 1초당 트랜잭션이(commit, rollback) 얼마나 발생했는지 보여주는 수치라고 생각하면 됩니다.
 
2. 계산 방법
(1) QPS

mysql> show global status where variable_name='uptime';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Uptime        | 711932 |
+---------------+--------+
1 row in set (0.10 sec)

mysql> show global status where variable_name='Questions';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Questions     | 40450 |
+---------------+-------+
1 row in set (0.00 sec)

 

QPS = Questions/Uptime

 
- 디비가 운영되는 동안 초당 쿼리가 0.05개가 발생된다고 볼 수 있을 것 같습니다.
- 이것은 디비가 운영되면서 평균적인 수치라고 한다지만, 해당 수치로 QPS를 판별하기에는 좀 부족한면이 있다고 생각합니다.
- 시간대에 따라 쿼리수가 급격하게 증가하거나 급속도로 줄어드는 경우가 대부분일 것이라 생각되는데, 시간대에 맞게 QPS를 캐치하는 것이 맞다고 생각됩니다.
- 그래서 주기적으로(자동으로) 모니터링하는 것이 좋습니다.  그 중에서 아래와 같은 계산식으로 QPS 를 추적하는 것도 좋은 방법이 아닐까 생각합니다.

1분동안 발생된 QPS = (현재 Questions - 60초전 Questions)/60

 
(2) TPS

mysql> show global status where variable_name = 'Com_commit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_commit    | 3843  |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show global status where variable_name = 'Com_rollback';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_rollback  | 4     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show global status where variable_name = 'Uptime';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Uptime        | 713523 |
+---------------+--------+
1 row in set (0.00 sec)

 

TPS = (Com_commit+Com_rollback)/Uptime

- 초당 트랜잭션이 발생된 수 입니다.
- 이것은 굉장히 부적합한 계산법인 것 같습니다. 이유는 제가 확인한 바, Com_commit, Com_rollback의 수치가 증가하는 경우는 직접 commit, 또는 rollback을 입력하지 않는 이상 증가하지 않습니다.
만약 autocommit 값이 ON 일 경우 DML작업을 하여도 별도로 commit 하지 않아, Com_commit 값은 증가되지 않습니다. 그렇기때문에 TPS 값은 많이 부족한 값이 될 것으로 보입니다.
 
3. 세분화 된 쿼리수 정보

mysql> show global status where variable_name like 'Com_%';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Com_admin_commands                  | 3     |
| Com_assign_to_keycache              | 0     |
| Com_alter_db                        | 0     |
| Com_alter_event                     | 0     |
| Com_alter_function                  | 0     |
| Com_alter_instance                  | 0     |
| Com_alter_procedure                 | 0     |
| Com_alter_resource_group            | 0     |
| Com_alter_server                    | 0     |
                    .
                    .
                    .
| Com_uninstall_component             | 0     |
| Com_uninstall_plugin                | 0     |
| Com_unlock_instance                 | 0     |
| Com_unlock_tables                   | 0     |
| Com_update                          | 0     |
| Com_update_multi                    | 0     |
| Com_xa_commit                       | 0     |
| Com_xa_end                          | 0     |
| Com_xa_prepare                      | 0     |
| Com_xa_recover                      | 0     |
| Com_xa_rollback                     | 0     |
| Com_xa_start                        | 0     |
| Com_stmt_reprepare                  | 0     |
+-------------------------------------+-------+
172 rows in set (0.02 sec)

 

Variable NameDescription
Questions전체 쿼리 요청 수
Com_selectselect 수
Com_insertinsert 수
Com_updateupdate 수
Com_deletedelete 수

 
위 내용들은 5.x 버전에는 information_schema.global_status, 8.0 버전에서는 performance_schema.global_status에서도 확인이 가능합니다. 그러나 8.0에서는 누락된 값들이(Com_insert, Com_update 등등) 많이 보여지고 있습니다.

반응형