diff options
| author | eunhhu <[email protected]> | 2026-09-28 11:26:44 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-28 11:26:44 +0100 |
| commit | bde7c586a054e4bce18f70fc503ef8413711b8cd (patch) | |
| tree | cc01779420050be33ad4e530572969d4b93754f4 /docs/research/092-tpcc.md | |
| parent | 3a9de18e39b5513c4d77b553240d6e0f088af968 (diff) | |
| download | pure-bde7c586a054e4bce18f70fc503ef8413711b8cd.tar.gz pure-bde7c586a054e4bce18f70fc503ef8413711b8cd.zip | |
Measure TPC-C again with compact log records
Diffstat (limited to 'docs/research/092-tpcc.md')
| -rw-r--r-- | docs/research/092-tpcc.md | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/docs/research/092-tpcc.md b/docs/research/092-tpcc.md index fec38f4..247c189 100644 --- a/docs/research/092-tpcc.md +++ b/docs/research/092-tpcc.md @@ -1,4 +1,4 @@ -# 092 — TPC-C: 같은 트랜잭션, 같은 상태, RAM에서 SQLite의 4배, SD 카드에서 56배 +# 092 — TPC-C: 같은 트랜잭션, 같은 상태, RAM에서 SQLite의 4배, SD 카드에서 90배 2026-09-28. 외부 피드백 002의 둘째 항목(범용성)의 마지막 조각. [090](090-tables.md)이 표 크기의 상태와 한 트랜잭션, [091](091-queries.md)이 임의 질의를 세웠다면, 여기서는 OLTP의 표준 부하인 TPC-C의 다섯 트랜잭션(New-Order, Payment, @@ -138,6 +138,12 @@ libc의 memcpy가 41%였고, 트리 저장소의 편집(`chunk_bytes`, `children 죽여도, 다시 시작하면 전부 이전 아니면 전부 이후다. 실패(죽지 않고)는 그 저장만 없던 일이 되고, 불확실은 다시 시작할 때까지 저장을 막는다. 이전 형식(`PLS1`, `PLS2`)의 저장소는 시작할 때 이미지로 옮겨진다. +**7. 기록을 작게.** 첫 SD 측정의 로그는 트랜잭션당 약 0.52 KB였고, 이 카드의 지속 쓰기(초당 3–8 MB)가 한계였다. 수가 +모두 binary64(8바이트)로 적혔지만 TPC-C의 값은 대부분 작은 정수다. 기록은 이제 위치를 varint로, 크기가 2^53 미만인 +정수를 zigzag varint로, 그 밖의 수를 표시 1바이트와 8바이트로, text 길이를 varint로 적는다. 주문 줄 삽입은 53바이트에서 약 +24바이트로, 재고 필드 설정은 14바이트에서 약 7바이트로 준다. 수는 비트 그대로 돌아온다(-0, 2^53의 경계, 비정규 수까지). +기록이 항목보다 작아져 뒤에 붙기만 하는 목록은 기록 크기 규칙에 닿지 않는다. 그런 목록의 이미지는 로그 크기 규칙이 쓴다. + ## 측정 W=1(창고 하나, 초기 행 약 57만), Raspberry Pi 5(4코어), 서버는 코어 0–2, Pure의 부하 생성기 @@ -148,36 +154,35 @@ W=1(창고 하나, 초기 행 약 57만), Raspberry Pi 5(4코어), 서버는 코 | | 초당 트랜잭션 | 분당 New-Order | New-Order p50 / p99 | 트랜잭션당 서버 CPU | |---|---:|---:|---:|---:| -| Pure, 16터미널 | 35,863 | 959,979 | 0.45 / 1.3 ms | 45.5 µs | -| Pure, 64터미널 | 38,564 | 1,031,566 | 1.7 / 3.8 ms | 48.7 µs | -| Pure, 128터미널 | **39,449** | 1,052,334 | 3.3 / 7.4 ms | 50.0 µs | -| SQLite FULL, 1스레드 | 9,493 | 254,310 | 0.15 / 1.2 ms | | -| SQLite FULL, 4스레드 | 9,141 | 244,796 | 0.16 / 1.2 ms | | +| Pure, 16터미널 | 36,697 | 982,183 | 0.45 / 1.0 ms | 44.3 µs | +| Pure, 64터미널 | 38,509 | 1,029,948 | 1.7 / 4.1 ms | 47.3 µs | +| Pure, 128터미널 | **39,977** | 1,066,231 | 3.2 / 6.7 ms | 49.2 µs | +| SQLite FULL, 1스레드 | 9,529 | 255,250 | 0.15 / 1.1 ms | | +| SQLite FULL, 4스레드 | 9,037 | 242,158 | 0.16 / 1.2 ms | | -16터미널은 바꾸기 전 4,858건에서 7.4배가 됐다. 트랜잭션당 CPU는 213 µs에서 45.5 µs로 줄었다. 이 CPU에는 HTTP와 JSON이 -들어 있다. 적재(57만 행)는 Pure 0.72초(이진 행을 한 요청에 1.4 MB씩), SQLite 1.56초(파이썬 `executemany`)다. +16터미널은 바꾸기 전 4,858건에서 7.6배가 됐다. 트랜잭션당 CPU는 213 µs에서 44.3 µs로 줄었다. 이 CPU에는 HTTP와 JSON이 +들어 있다. 적재(57만 행)는 Pure 0.71초(이진 행을 한 요청에 1.4 MB씩), SQLite 1.56초(파이썬 `executemany`)다. **SD 카드(ext4).** 두 쪽 모두 커밋이 장치에 닿은 뒤 답한다. | | 초당 트랜잭션 | 분당 New-Order | New-Order p50 / p99 | |---|---:|---:|---:| -| Pure, 16터미널 | 1,465 | 39,149 | 5.6 / 74 ms | -| Pure, 64터미널 | 3,008 | 80,545 | 8.7 / 221 ms | -| Pure, 128터미널 | **3,073** | 82,063 | 11.8 / 623 ms | -| SQLite FULL, 1스레드 | 37 | 1,012 | 5.1 / 557 ms | -| SQLite FULL, 4스레드 | 55 | 1,425 | 5.1 / 1,245 ms | +| Pure, 16터미널 | 1,743 | 46,471 | 5.4 / 59 ms | +| Pure, 64터미널 | 3,237 | 86,604 | 9.2 / 147 ms | +| Pure, 128터미널 | **4,502** | 120,121 | 15.4 / 246 ms | +| SQLite FULL, 1스레드 | 50 | 1,346 | 4.9 / 492 ms | +| SQLite FULL, 4스레드 | 44 | 1,181 | 4.9 / 1,704 ms | -카드는 상태에 따라 흔들린다. 같은 카드에서 세 번 잰 128터미널은 3,073–5,396건, SQLite FULL은 48–57건이었다. 로그로 옮기기 -전(목록을 트리에 두던 때)에는 30초 가운데 16초가 0이었고, 이제는 매초 처리한다. +카드는 상태에 따라 흔들린다. 압축 기록으로 128터미널을 세 번 재니 4,502–6,824건이었다(그 전에는 3,073–5,396건). +SQLite FULL은 44–57건이었다. 로그로 옮기기 전(목록을 트리에 두던 때)에는 30초 가운데 16초가 0이었다. 이제는 매초 처리한다. SQLite의 `synchronous=NORMAL`(WAL 체크포인트 때만 동기화해 전원이 끊기면 최근 커밋을 잃는다)은 초당 36건(1스레드), -372건(4스레드)이다. `OFF`(동기화 없음)는 8,941건이다. Pure는 내구성을 낮추지 않고도 NORMAL의 8배다. +372건(4스레드)이다. `OFF`(동기화 없음)는 8,941건이다. Pure는 내구성을 낮추지 않고도 NORMAL의 12배다. ## 다음 -- **기록을 더 작게.** 로그는 트랜잭션당 약 0.52 KB다. 이 카드의 지속 쓰기(초당 3–8 MB)에 닿는 양이다. 수가 모두 - binary64(8바이트)로 적히지만 TPC-C의 값은 대부분 작은 정수다. 정수를 가변 길이로 적고 한 저장에서 같은 항목의 여러 설정을 - 한 기록으로 합치면 절반 아래로 준다. +- **기록을 더 작게.** 한 저장 안에서 같은 항목의 설정 여럿(재고의 수량·누계·주문 수)을 한 기록으로 합치고, 이미지도 + 압축 형식으로 쓰면 SD 카드의 쓰기가 더 준다. - **덧붙는 목록의 이미지.** 주문 줄처럼 뒤에 붙기만 하는 목록도 체크포인트가 이미지 전체를 다시 쓴다. 바뀐 잎만 새로 쓰는 이미지(이전 이미지와 잎을 나눠 쓰는)가 다음이다. - **메모리.** 16/64/128터미널을 차례로 20초씩 돌린 뒤 서버의 상주 메모리는 0.5/0.9/1.3 GB다. 대부분 늘어난 주문 줄(약 1,000만 |
