aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/059-immutable-file-copy-path.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/059-immutable-file-copy-path.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/059-immutable-file-copy-path.md')
-rw-r--r--docs/research/059-immutable-file-copy-path.md57
1 files changed, 57 insertions, 0 deletions
diff --git a/docs/research/059-immutable-file-copy-path.md b/docs/research/059-immutable-file-copy-path.md
new file mode 100644
index 0000000..42bff3a
--- /dev/null
+++ b/docs/research/059-immutable-file-copy-path.md
@@ -0,0 +1,57 @@
+# 059 — 큰 불변 문서의 바뀌지 않은 구간을 복사하는 비용
+
+기본 저장소는 문서 전체를 불변 파일로 다시 공개한다. 1 MiB 문서의 마지막
+1바이트를 바꿀 때 기존 바이트를 4 KiB 스택 버퍼로 읽고 새 파일에 쓴다.
+[재현 검사](../../prototypes/connections/check_copy_path.py)는 같은
+`editor.pure` CLI로 문서를 만든 뒤 실제 마지막 바이트를 수정하고, 별도
+프로세스에서 최종 1 MiB 본문을 대조한다. 저장 디렉터리는 작업트리의
+ext4에 만들고 `findmnt`로 파일시스템을 기록한다. Linux `strace`로 객체 파일의
+성공한 호출을 세고 작은 네이티브 부모의 `wait4`로 자식 피크 RSS를 잰다.
+
+선택형 `PURE_STORE_CFR_COPY` 경로는 길이 16 KiB 이상의 바뀌지 않은
+구간에 Linux `copy_file_range()`를 먼저 시도한다. 짧은 복사는 반복하고,
+지원되지 않는다고 보고되면 남은 오프셋부터 기존 읽기·쓰기로 이어간다.
+다른 저장 형식을 만들지 않으며, 기본 빌드와 macOS 빌드에는 들어가지 않는다.
+부분 복사 뒤 미지원 오류를 강제로 주입한 C 저장 검사도 통과했다.
+
+| 같은 1 MiB 문서의 마지막 1 B 수정 | 기본 | 선택형 Linux 복사 |
+|---|---:|---:|
+| 원본 객체 `pread64` 호출 | 257 | 1 |
+| `copy_file_range` 호출·전달 바이트 | 0 | 1회·1,048,575 B |
+| 임시 객체 `write` 호출·바이트 | 258회·1,048,600 B | 2회·25 B |
+| 이 작업의 자식 피크 RSS | 1,056 KiB | 1,056 KiB |
+| CLI 링크 `text` | 35,783 B | 36,052 B |
+| HTTP 호스트 링크 `text` | 43,938 B | 44,207 B |
+
+[실제 복사 추적·본문 해시·RSS](../../prototypes/connections/results/2026-09-24-copy-range/copy-path.json),
+[기본 실행물 비용](../../prototypes/connections/results/2026-09-24-copy-range/default-profile.json),
+[선택 실행물 비용](../../prototypes/connections/results/2026-09-24-copy-range/profile.json).
+선택에 따른 링크 `text` 증가는 CLI·HTTP에서 각각 **269 B**다.
+[기본 코어](../../prototypes/connections/results/2026-09-24-copy-range/default-core.json)의
+`text` 5,908 B·영역 128 B는 바뀌지 않는다. 선택형 CLI의 1 MiB 문서 생성
+[RSS 회귀](../../prototypes/connections/results/2026-09-24-copy-range/memory.json)도
+4 MiB 상한 안이다. 위 1,056 KiB는 기존 문서 수정 한 번의 피크이며,
+생성·출력을 합친 전체 앱 피크와 혼동하지 않는다.
+
+이 결과는 **사용자 공간 읽기·쓰기 호출 수**의 감소다. 전달된 1,048,575 B가
+사라진 것은 아니다. 파일시스템이 데이터를 실제로 복사할지 공유할지는 구현에
+달렸고, 물리 디스크 쓰기량·지연 시간의 개선은 증명하지 않았다. Linux
+[copy_file_range(2) 설명](https://man7.org/linux/man-pages/man2/copy_file_range.2.html)은
+부분 복사와 파일시스템별 구현 및 오래된 커널의 일부 가상 파일시스템 결함을
+명시한다. 따라서 이 경로는 **현재 Linux 6.18/ext4에서 검증한 선택형 연구
+경로**로 남긴다. 다른 커널·파일시스템의 성공 반환이 실제 본문과 일치하는지는
+별도로 검증해야 한다.
+
+[실제 앱 기능 검사](../../prototypes/connections/results/2026-09-24-copy-range/functional.json),
+[8클라이언트·1,024문서 검사](../../prototypes/connections/results/2026-09-24-copy-range/service-scale.json)는
+최종 문서와 프로세스 상한을 통과했다. 다만 규모 검사의 문서는 8 KiB이므로
+이 선택형 16 KiB 이상 복사 경로의 **성능 검사로 해석하지 않는다**.
+기본 경로의 [전체 릴리스 검사](../../prototypes/connections/results/2026-09-24-copy-range/default-functional.json)도
+통과했다. 재현 명령은 `make -C prototypes/connections check-copy-range`다.
+
+최종 [소스 묶음](../../prototypes/connections/results/2026-09-24-copy-range-source/pure-source-preview.tar.gz)은
+166개 파일, 압축 324,261 B, SHA-256
+`ce48ef8e330cff470b78aec9c9e6c6d8877e4c8c371512f190b91b6036ddc8ba`다.
+[깨끗한 디렉터리 검사](../../prototypes/connections/results/2026-09-24-copy-range-source/source-check-linux-aarch64.json)에서
+C 동작·두 TUI의 PTY 편집·선택형 TLS 피어·파일 간 복사·Linux 릴리스
+상한을 모두 통과했다. 이 압축량은 소스 배포 비용이지 상주 메모리가 아니다.