일반 dbms를 사용중인데, 성능이 문제가 되는 경우가 발생하였습니다. 그런데, NoSQL 종류의 DBMS들과 비교를 해 보고 싶어서 온라인 OLTP 트랜잭션 성능을 측정하는 tpcc 테스트를 통해 비교하고 싶었습니다. 그런데, NoSQL류와 mariaDB나 altibase와 같은 일반 DBMS를 비교할 수 있는 것을 찾아보다가 py-tpcc를 알게되었습니다. 오늘은 py-tpcc로 altibase dbms의 성능을 측정하는 방법을 알아보겠습니다.
Table Of Contents
py-tpcc란?
py-tpcc는 Python으로 작성된 TPC-C 성능 테스트 도구입니다. TPC-C는 온라인 트랜잭션 처리(OLTP) 벤치마크로, 온라인 비즈니스에서 사용되는 여러 트랜잭션 유형을 잘 묘사한 벤치마크 테스트입니다.
py-tpcc는 특히 MongoDB와 같은 NoSQL 데이터베이스의 성능을 테스트하는 데 사용됩니다. 실제로 MongoDB에서는 이 py-tpcc를 이용하여 성능을 측정하였습니다. py-tpcc를 통해 대량의 짧고 빠른 트랜잭션을 처리하는 데이터베이스 관리 시스템과 NoSQL의 성능을 비교해 볼 수 있습니다.
py-tpcc를 사용하면 데이터베이스의 성능을 정확하게 측정하고 비교할 수 있어, 데이터베이스 선택이나 성능 최적화에 도움이 될 수 있습니다. 이 도구는 오픈 소스로 제공되므로, 필요에 따라 사용자가 직접 코드를 수정하거나 확장할 수도 있습니다.
py-tpcc로 Altibase 성능 측정을 위한 사전 준비
Altibase와 같은 일반 DBMS에서 py-tpcc를 테스트하기 위해서는 python과 연동을 해야합니다. 물론 Altibase는 당연히 설치되어있어야 합니다.
altibase를 python과 연동하기 위한 가장 쉬운 방법은 pyodbc를 이용하는 것입니다. 이를 위해서 먼저 Altibase를 pyodbc에 연동해야합니다. Altibase에서 pyodbc를 사용하는 방법은 아래 링크에서 확인하실 수 있습니다. 먼저 아래 링크를 따라서 altibase를 pyodbc로 연동해 놓습니다.
우분투-2204-리눅스에서-pyodbc로-altibase-DBMS-연동하기
주의사항으로 Altibase에는 isql 이라는 툴이 있는데, unixODBC에도 동일하게 isql이 존재합니다. 테스트를 위해서는 Altibase의 isql을 사용하므로 $ALTIBASE_HOME/bin이 PATH 환경변수에 먼저 나와있어야 합니다.
Altibase 성능 측정을 위한 py-tpcc 소스코드 다운로드
altibase나 mariadb 같은 일반 DBMS의 경우 MongoDB의 공식 py-tpcc 소스에서는 성능측정이 되지 않습니다. 그러므로, altibase용 드라이버가 구현된 아래 github의 소스를 다운받습니다.
~$ git clone https://github.com/lswhh/py-tpcc
tpcc.py 소스가 있는 디렉토리로 이동합니다.
~/py-tpcc$ cd pytpcc/
~/py-tpcc/pytpcc$ pwd
/home/altibase/py-tpcc/pytpcc
py-tpcc로 Altibase 성능 테스트
위에서 설명드린 py-tpcc를 clone 받으면 tpcc.py 파일이 있습니다. 이 파일을 이용해서 pyodbc로 연동된 일반 DBMS의 tpcc 성능 테스트를 할 수 있습니다.
help 명령을 다음과 같이 수행해 보면 실행할 수 있는 옵션들을 확인할 수 있습니다.
~/py-tpcc/pytpcc$ python3 tpcc.py -h
usage: tpcc.py [-h] [--config CONFIG] [--reset] [--scalefactor SF] [--warehouses W] [--duration D] [--ddl DDL] [--clients N]
[--stop-on-error] [--no-load] [--no-execute] [--print-config] [--debug]
{cassandra,scalaris,hbase,csv,membase,mariadb,altibase,mongodb,tokyocabinet,redis,sqlite,couchdb}
Python implementation of the TPC-C Benchmark
positional arguments:
{cassandra,scalaris,hbase,csv,membase,mariadb,altibase,mongodb,tokyocabinet,redis,sqlite,couchdb}
Target system driver
options:
-h, --help show this help message and exit
--config CONFIG Path to driver configuration file
--reset Instruct the driver to reset the contents of the database
--scalefactor SF Benchmark scale factor
--warehouses W Number of Warehouses
--duration D How long to run the benchmark in seconds
--ddl DDL Path to the TPC-C DDL SQL file
--clients N The number of blocking clients to fork
--stop-on-error Stop the transaction execution when the driver throws an exception.
--no-load Disable loading the data
--no-execute Disable executing the workload
--print-config Print out the default configuration file for the system and exit
--debug Enable debug log messages
테스트를 실행하기 위해서는 아래 명령을 수행하여 정상 동작 여부를 가장 빠르게 테스트를 간단하게 해 볼 수 있습니다.
python3 tpcc.py --warehouses 1 --client 1 --duration 1 altibase
기본적으로 warehouse는 4개의 default 값을 가지며 client는 default 1입니다. 그리고, 중요한 duration은 60초의 기본 값을 가집니다.
즉, 다음과 같이 수행하면 warehouse 4, scalefactor 1, 그리고 duration 60의 값을 가지게 되어서 16 클라이언트가 약 400MB 데이터에 대해서 1분 동안 tpcc 테스트 한 결과를 보여줍니다.
python3 odbctpcc.py --client 16 altibase
테스트를 간략하게 수행하면 처음에 몇 가지 정보와 db 초기화 등을 거치고 난 후 data를 loading합니다. 데이터 로딩은 수백건씩 삽입하면서 중간에 에러가 발생한 현황등을 출력합니다.
데이터 로딩이 끝나고 나면 지정된 시간과 클라이언트를 이용해서 테스트를 수행한 후 결과를 텍스트로 출력합니다.
다음은 1 client로 1초동안 4개의 warehouse에 pytpcc 테스트를 수행한 결과를 보여줍니다.
% python3 tpcc.py --client 1 --duration 1 --reset altibase
2024-02-15 17:34:39,988 [<module>:249] INFO : Reseting database
command: isql -s 127.0.0.1 -u sys -p manager < drop.sql
command: isql -s 127.0.0.1 -u sys -p manager < altibase-tpcc.sql
connection string: DSN=altibase-dsn;UID=sys;PWD=manager;
2024-02-15 17:34:40,468 [<module>:252] INFO : Initializing TPC-C benchmark using altibase-dsn
2024-02-15 17:34:40,469 [<module>:262] INFO : Loading TPC-C benchmark data using altibase-dsn
...
bulk data inserted 500 rows into table: STOCK, error occur 0 rows
bulk data inserted 500 rows into table: STOCK, error occur 0 rows
2024-02-15 17:49:42,585 [loadFinish:259] INFO : Commiting changes to database
2024-02-15 17:49:44,119 [<module>:289] INFO : Final Results
2024-02-15 17:49:44,119 [<module>:290] INFO : Threads: 1
{'NEW_ORDER': 41, 'PAYMENT': 29, 'STOCK_LEVEL': 5, 'DELIVERY': 3, 'ORDER_STATUS': 3}
{'DELIVERY': {'latency': {'min': 25.457382202148438, 'max': 33.4315299987793, 'p50': 26.34406089782715, 'p75': 33.4315299987793, 'p90': 33.4315299987793, 'p95': 33.4315299987793, 'p99': 33.4315299987793}, 'total': 3}, 'NEW_ORDER': {'latency': {'min': 8.667707443237305, 'max': 46.47207260131836, 'p50': 16.320228576660156, 'p75': 19.53744888305664, 'p90': 22.897958755493164, 'p95': 29.289960861206055, 'p99': 46.47207260131836}, 'total': 41}, 'ORDER_STATUS': {'latency': {'min': 1.3432502746582031, 'max': 8.341550827026367, 'p50': 2.726316452026367, 'p75': 8.341550827026367, 'p90': 8.341550827026367, 'p95': 8.341550827026367, 'p99': 8.341550827026367}, 'total': 3}, 'PAYMENT': {'latency': {'min': 2.8145313262939453, 'max': 16.49332046508789, 'p50': 6.321191787719727, 'p75': 7.370710372924805, 'p90': 11.198997497558594, 'p95': 11.283397674560547, 'p99': 16.49332046508789}, 'total': 29}, 'STOCK_LEVEL': {'latency': {'min': 2.4347305297851562, 'max': 6.731271743774414, 'p50': 2.722501754760742, 'p75': 3.016948699951172, 'p90': 6.731271743774414, 'p95': 6.731271743774414, 'p99': 6.731271743774414}, 'total': 5}}
2024-02-15 17:49:44,120 [<module>:291] INFO :
========================================================================================================================================================================================================
Data Loading Time: 902 seconds
Execution Results after 1 seconds
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Complete Time (µs) Percentage Retries minLatMs p50 p75 p90 p95 p99 maxLatMs Aborts
DELIVERY 3 0.085 3.70 0,0 25.46 26.34 33.43 33.43 33.43 33.43 33.43 0
NEW_ORDER 41 0.697 50.62 0,0 8.67 16.32 19.54 22.90 29.29 46.47 46.47 1
ORDER_STATUS 3 0.012 3.70 0,0 1.34 2.73 8.34 8.34 8.34 8.34 8.34 0
PAYMENT 29 0.177 35.80 0,0 2.81 6.32 7.37 11.20 11.28 16.49 16.49 0
STOCK_LEVEL 5 0.017 6.17 0,0 2.43 2.72 3.02 6.73 6.73 6.73 6.73 0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL 81 0.989
pytppc로 altibase 테스트 후 결과 보는 법
pytpcc의 테스트 결과를 하나씩 설명드리겠습니다.
먼저, 데이터를 로딩하는데는 902초가 걸렸다는 것을 출력해 줍니다. 다음으로 duration 기간동안 client가 접속해서 tpcc 테스트를 수행한 결과를 표로 보여줍니다. 하나의 로우는 tpcc에서 사용하는 비즈니스 로직의 테스트 항목을 나타납니다. 주로 살펴보는 것은 NEW_ORDER가 몇 건 처리되었는지 보는것입니다.
아래 테스트 결과를 보시면 NEW_ORDER는 1초에 1client로 41건이 처리된 것을 보실 수 있습니다.
=================================================================================================================================================================================================== =====
Data Loading Time: 902 seconds
Execution Results after 1 seconds
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----
Complete Time (µs) Percentage Retries minLatMs p50 p75 p90 p95 p99 maxLatMs A borts
DELIVERY 3 0.085 3.70 0,0 25.46 26.34 33.43 33.43 33.43 33.43 33.43 0
NEW_ORDER 41 0.697 50.62 0,0 8.67 16.32 19.54 22.90 29.29 46.47 46.47 1
ORDER_STATUS 3 0.012 3.70 0,0 1.34 2.73 8.34 8.34 8.34 8.34 8.34 0
PAYMENT 29 0.177 35.80 0,0 2.81 6.32 7.37 11.20 11.28 16.49 16.49 0
STOCK_LEVEL 5 0.017 6.17 0,0 2.43 2.72 3.02 6.73 6.73 6.73 6.73 0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----
TOTAL 81 0.989
Complete: 각 트랜잭션의 완료 횟수입니다.
Time (s): 각 트랜잭션의 총 실행 시간입니다.
Percentage: 각 트랜잭션의 완료 횟수와 실행 시간이 전체 트랜잭션에 대한 비율입니다.
Retries: 각 트랜잭션의 재시도 횟수입니다.
minLatMs, p50, p75, p90, p95, p99, maxLatMs: 최소 latency(응답시간, 지연시간)과
각 트랜잭션의 중간, 75번째 백분위수, 90번째 백분위수, 95번째 백분위수, 99번째 백분위수, 최대 지연 시간입니다.
Aborts: 각 트랜잭션의 중단 횟수입니다.
오늘은 DBMS 성능 테스트 툴인 pytpcc를 이용해서 python(파이썬)으로 altibase라는 메모리 DBMS의 성능 테스트를 하는 방법을 알아보았습니다.
오픈소스 툴인 pytpcc를 이용해서 일반 DBMS와 NoSQL간의 성능 측정과 비교를 어렵지 않게 할 수 있는 것 같습니다.
'IT' 카테고리의 다른 글
DBMS 성능 테스트 모델 TPC-C의 성능 측정 기준 및 방법 - NoSQL, RDBMS (22) | 2024.02.19 |
---|---|
DBMS 성능 테스트 모델 TPC-C에 대해서 - Altibase, Mariadb, MySQL, Oracle, NoSQL 등 (25) | 2024.02.19 |
구글(Google) AI 제미나이(Gemini) 사용기 - 바드에서 바뀌었어요 (1) | 2024.02.15 |
python으로 NoSQL tpcc 성능 테스트 하는 법- OLTP, TPC-C (1) | 2024.02.14 |
파이썬 가상환경(venv)이란?- 생성, 활성화, 비활성화, 삭제하는 방법 (4) | 2024.02.13 |