aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/034-hybrid-document-storage.md
blob: 0dd9a5b7effabf70b626e4b5e6ae1855667ef107 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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`다.