aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/059-immutable-file-copy-path.md
blob: 42bff3acfa5bcd5b013325d77be80c51ae3833e4 (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
# 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 릴리스
상한을 모두 통과했다. 이 압축량은 소스 배포 비용이지 상주 메모리가 아니다.