aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/092-tpcc.md
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-28 11:26:44 +0100
committereunhhu <[email protected]>2026-09-28 11:26:44 +0100
commitbde7c586a054e4bce18f70fc503ef8413711b8cd (patch)
treecc01779420050be33ad4e530572969d4b93754f4 /docs/research/092-tpcc.md
parent3a9de18e39b5513c4d77b553240d6e0f088af968 (diff)
downloadpure-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.md43
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만