aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/034-hybrid-document-storage.md
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-24 17:14:54 +0100
committereunhhu <[email protected]>2026-09-24 17:14:54 +0100
commitb1ce1927022d374198441afafeb27199fc8a052a (patch)
tree6021f175f4c67ed03b44240eaa2f90d846f12f6f /docs/research/034-hybrid-document-storage.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/034-hybrid-document-storage.md')
-rw-r--r--docs/research/034-hybrid-document-storage.md77
1 files changed, 77 insertions, 0 deletions
diff --git a/docs/research/034-hybrid-document-storage.md b/docs/research/034-hybrid-document-storage.md
new file mode 100644
index 0000000..0dd9a5b
--- /dev/null
+++ b/docs/research/034-hybrid-document-storage.md
@@ -0,0 +1,77 @@
+# 034 — 작은 값은 인라인, 큰 값은 페이지로 저장
+
+2026-09-24. [033](033-paged-document-storage.md)의 페이지 전용 실험은 1 MiB 문서의
+1 B 수정을 줄였지만 1 B 문서의 수정 요청량을 25 B에서 16,440 B로 늘렸다.
+이번에는 같은 문서 앱의 **선택형** 저장소에서 16 KiB 이하의 값은 기존 `PUREB001`
+파일에 직접 담고, 그보다 큰 값만 `PUREP001` 페이지 루트로 표현한다. 실행 코어,
+기본 `store.c`, 기본 패키지는 변경하지 않았다.
+
+[`store-paged.c`](../../prototypes/connections/store-paged.c)는 두 형식을 읽고, 결과
+길이에 따라 다음 루트 형식을 고른다. 크기 경계를 넘을 때는 이전 형식의 논리
+바이트를 읽어 새 파일을 완성한 후 공개한다. 페이지 저장 중 길이가 같은 부분
+수정은 기존처럼 변경된 페이지만 추가한다. 형식 전환과 인라인 수정에도 기존
+버전 충돌, 이전 읽기 스냅샷, 공개 전 실패와 공개 후 `PURE_UNCERTAIN` 계약을
+적용한다. [단위 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/unit.json)는
+양방향 16 KiB 경계 전환, 기존 큰 `PUREB001` 파일의 첫 수정, 오래된 읽기,
+크래시·충돌·혼합 편집을 포함한다. [ASan·UBSan 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/unit-asan.json)도 통과했다.
+
+## 실제 비용과 마이크로 경계
+
+같은 `editor.pure` CLI가 문서를 만들고 1 B를 바꿀 때, `strace`에서 객체 파일에
+성공한 사용자 공간 `write` 요청만 합산했다. 물리 디스크 쓰기량, 저널,
+디렉터리 동기화와 지연 시간은 포함하지 않는다.
+
+| 작업 | 기본 불변 파일 | 선택형 하이브리드 |
+|---|---:|---:|
+| 1 MiB 마지막 1 B 교체 | 1,048,600 B / 258회 | 16,944 B / 3회 |
+| 1 B 문서의 1 B 교체 | 25 B / 2회 | 25 B / 2회 |
+
+[원본 쓰기 추적](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/write-cost.json).
+큰 문서의 약 61.9배 적은 요청 바이트와 작은 문서의 동일한 요청량을 확인했다.
+256개의 다른 파일이 있는 저장 디렉터리에서도 작은 값의 수정은 디렉터리
+항목을 훑는 `getdents64` 호출이 없었다.
+[작은 값 경로 추적](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/small-scan.json).
+단, 기존 큰 `PUREB001` 문서를 처음 수정할 때는 전체를 페이지 파일로 옮겨
+써야 한다. 그 한 번의 전환 비용과 이후 수정의 총 지연·처리량은 아직 측정하지
+않았으므로 더 빠른 저장소라는 결론은 내리지 않는다.
+
+코드 비용도 늘었다. 같은 Linux AArch64/GCC 14 `-O2` 빌드에서 기본 CLI의
+링크된 `text`는 35,807 B, 하이브리드 CLI는 **41,064 B**로 5,257 B 더 크다.
+페이지 전용 실험의 39,960 B보다도 1,104 B 늘었다. 기존 선택형 페이지
+예산인 40,960 B를 104 B 초과했다. 그래서 실패한 예산을 자동으로 통과시킨
+것이 아니라 [별도의 42 KiB 연구 상한](../../prototypes/connections/hybrid-budget.json)을
+명시했다. [코드·직접 의존성 결과](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/profile.json)는
+CLI와 HTTP 모두 libc만 직접 필요함을 확인한다. 1 MiB 새 문서 편집 CLI의
+피크 RSS는 **2,080 KiB**이며 기존 4 MiB 회귀 상한을 통과했다.
+[프로세스 메모리 결과](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/memory.json).
+이 상한은 파일시스템 캐시, 동시 작업, 선택형 UI와 TLS를 포함하지 않는다.
+
+## 앱과 배포 경계
+
+[CLI·HTTP 전체 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/app-release.json),
+[앱 ASan·UBSan 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/app-asan.json),
+[인증 TLS 문서 피어](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/peer.json),
+[GTK 문서·정의 편집](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/gtk-flow.json)을
+같은 저장 경로로 통과했다. GTK 큰 문서 창은 43,632 KiB RSS로, 이 실험이
+선택형 UI의 메모리 문제를 해결하지는 않는다.
+
+[CLI만 든 선택형 묶음](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/pure-document-hybrid-micro-linux-aarch64.tar.gz)은
+26,045 B이고, [HTTP·TLS·GTK까지 선택한 묶음](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/pure-document-hybrid-authoring-linux-aarch64.tar.gz)은
+114,025 B다. 각각 다른 디렉터리에 풀어
+[CLI와 양쪽 저장 형식](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/package-micro.json),
+[전체 앱 경로](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/package-full.json)를
+다시 확인했다. 시스템 공유 라이브러리는 묶음에 포함되지 않는다.
+
+작은 기존 `PUREB001` 파일은 그대로 사용할 수 있고, 큰 기존 파일도 읽고
+수정하면서 `PUREP001`로 전환할 수 있다. **기본 저장기는 전환된 큰 파일을
+읽을 수 없다.** 따라서 이 선택형 묶음에는 별도 저장 디렉터리를 사용해야
+한다. 16 KiB OS 페이지를 요구하며 macOS는 검증하지 않았다. 큰 동시 작업,
+세대 수거의 최악 지연, 실제 장치 쓰기량 및 운영 중 되돌리기 절차는 남아 있다.
+작은 값만 계속 수정하는 경로에서는 디렉터리 스캔을 피하므로, 크래시가 남긴
+임시 루트 파일도 다음 페이지 관련 작업 전까지 남을 수 있다.
+이 비용과 제한 때문에 기본 마이크로 런타임에 포함하지 않는다.
+
+재현 명령은 `make -C prototypes/connections check-hybrid`와
+`python3 prototypes/connections/check_write_cost.py --flat
+prototypes/connections/build/pure-edit --candidate
+prototypes/connections/build/hybrid/pure-edit --candidate-mode hybrid`다.