diff options
Diffstat (limited to 'docs/research/059-immutable-file-copy-path.md')
| -rw-r--r-- | docs/research/059-immutable-file-copy-path.md | 57 |
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 릴리스 +상한을 모두 통과했다. 이 압축량은 소스 배포 비용이지 상주 메모리가 아니다. |
