diff options
| author | eunhhu <[email protected]> | 2026-09-24 17:14:54 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-24 17:14:54 +0100 |
| commit | b1ce1927022d374198441afafeb27199fc8a052a (patch) | |
| tree | 6021f175f4c67ed03b44240eaa2f90d846f12f6f /docs/research/034-hybrid-document-storage.md | |
| parent | d34f9426d5317a1948f12f229439946728bc342a (diff) | |
| download | pure-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.md | 77 |
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`다. |
