diff options
Diffstat (limited to 'docs/research/027-fixed-native-capacity.md')
| -rw-r--r-- | docs/research/027-fixed-native-capacity.md | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/docs/research/027-fixed-native-capacity.md b/docs/research/027-fixed-native-capacity.md new file mode 100644 index 0000000..4783634 --- /dev/null +++ b/docs/research/027-fixed-native-capacity.md @@ -0,0 +1,90 @@ +# 027 — 작성 정의만큼만 예약하는 네이티브 실행물 + +2026-09-24. Linux AArch64, GCC 14.2, Zig 0.15.2. 첫 공개 체크포인트의 중간 결과다. +**기본 실행 코어의 범위를 늘리지 않고, 선택한 앱 인스턴스의 반복 비용을 줄였다.** +이 문서는 당시의 고정 용량 빌드 결과다. 이후 정의와 상태를 분리한 +[028 불변 프로그램 공유](028-shared-fixed-program.md)가 현재 CLI·피어 구조와 측정값이다. + +## 제거한 비용 + +기존 native scalar 모듈은 작은 작성물에도 상태 32개, 입력 8개, 명령 512개, 반응 64개, +포인터 대상 24개의 최대 배열을 **실행 정의와 교체 준비 공간 각각에** 예약했다. 실행 전용 CLI와 +피어는 빌드된 정의를 실시간 교체하지 않지만 인스턴스마다 20,064 B를 차지했다. 이 비용은 +동일한 작성물을 여러 독립 인스턴스로 운영할수록 반복된다. + +`prepare.mjs`가 이미 검증한 `.pure` 정의의 상태·입력·명령·반응·대상 개수를 Zig 빌드 프로필에 +함께 기록하도록 했다. `native-fixed.zig`는 기존 `engine.zig`를 해당 용량으로 빌드한다. +배열이 비어 있을 때 Zig가 인덱스 연산을 컴파일할 수 있도록 0개 항목에는 1칸만 예약한다. +언어의 상한 32/8/512/64/24는 그대로 검사한다. + +```text +.pure → 기존 컴파일러의 검증된 정의 → application.c + fixed-profile.zig + ↓ + 같은 scalar VM의 정확한 배열 용량 +``` + +고정 정의를 쓰는 `manage.py native` CLI와 `--peer`만 이 프로필을 선택한다. 작성 중에 새 +정의를 적용하는 `--desktop`과 브라우저 Wasm은 여전히 전체 용량을 가진다. 고정 실행물에서 +다른 정의로 바꾸려면 다시 빌드한다. 입력 하나의 실행 중에 크기 검사나 동적 배열 할당을 +추가하지 않았고, 새 파서나 별도 인터프리터도 만들지 않았다. 앱 계산은 여전히 기존 scalar +VM이며 AOT로 모든 연산을 기계어로 펼친 결과는 아니다. + +## 동작·한도 검증 + +[전체 용량 결과](../../prototypes/workbench/results/2026-09-24-fixed-capacity/general-parity-final.json)와 +[고정 용량 결과](../../prototypes/workbench/results/2026-09-24-fixed-capacity/fixed-parity-final.json)는 +동일한 기존 작성물 11개, 입력 170단계에 대해 네이티브 상태·출력을 Wasm 결과와 대조한다. +명령 319개인 `layout.pure`, 공통 규칙·대상별 배치를 포함한다. 두 C 호스트는 ASan/UBSan으로 +실행했고 Zig 모듈은 ReleaseSafe였다. 고정 `routed-layout.pure`에서는 용량보다 큰 상태·입력· +명령 정의가 거절되고 기존 활성 상태·버전이 남는 것도 확인했다. 브라우저/CLI 회귀 87개, +Zig 코어 37개, TLS 피어의 [인증·저장·오류 시나리오](../../prototypes/workbench/results/2026-09-24-fixed-capacity/peer-check.json)도 통과했다. + +| 작성물 | 명령 수 | 전체 용량 인스턴스 | 고정 용량 인스턴스 | +|---|---:|---:|---:| +| 비어 있는 작성물 | 0 | 20,064 B | 1,320 B | +| 카운터 | 17 | 20,064 B | 1,576 B | +| 직접 조작 | 82 | 20,064 B | 3,248 B | +| 대상별 공유 규칙 배치 | 117 | 20,064 B | 5,712 B | +| 피어와 CLI의 묶음 배치 | 117 | 20,064 B | 5,456 B | +| 명시적 세 도형 배치 | 319 | 20,064 B | 11,792 B | + +이는 `pure_scalar_bytes()`가 요구하는 인스턴스 저장 공간이다. 앱 컨트롤러, TLS·GTK, +스택·저장소·힙 관리 비용을 포함한 값이 아니다. + +반복 비용의 실제 효과를 별도로 확인했다. 같은 묶음 배치 정의로 독립 scalar 인스턴스 +1,000개를 초기화한 Linux 프로세스에서, 초기화 전후 RSS 차이의 3회 중앙값은 전체 용량 +**19,808 KiB**, 고정 용량 **5,536 KiB**였다. 둘 다 같은 실제 준비 정의를 적재했고 +각 인스턴스의 버전을 읽어 유효한 초기화를 확인했다. [원자료](../../prototypes/workbench/results/2026-09-24-fixed-capacity/instance-memory.json)와 +[재현 하네스](../../prototypes/workbench/native/instance-memory.c)를 보관했다. 이 수치는 +**scalar 인스턴스 1,000개의 메모리 확대 비용**만 비교한다. 1,000명 서비스의 전체 메모리나 +처리량·지연 개선이라는 뜻은 아니다. + +## 실행물 전체 비용 + +동일한 `routed-layout.pure`와 `-O2 -g` C 빌드의 [ELF 섹션 원자료](../../prototypes/workbench/results/2026-09-24-fixed-capacity/size.txt), +[stripped 파일 크기](../../prototypes/workbench/results/2026-09-24-fixed-capacity/stripped.txt), +[CLI 빌드 식별](../../prototypes/workbench/results/2026-09-24-fixed-capacity/fixed-cli-build.json), +[피어 빌드 식별](../../prototypes/workbench/results/2026-09-24-fixed-capacity/fixed-peer-build.json). + +| 선택한 범위 | 전체 용량 | 고정 용량 | +|---|---:|---:| +| scalar 오브젝트 `text` | 33,020 B | 18,252 B | +| CLI 실행물 `text` | 62,827 B | 48,059 B | +| CLI stripped ELF | 68,000 B | 68,000 B | +| TLS 피어 실행물 `text` | [026의 기준](026-secure-peer-link.md) 75,969 B | 61,201 B | +| TLS 피어 stripped ELF | [026의 기준](026-secure-peer-link.md) 133,936 B | 68,400 B | + +CLI의 `text`가 줄어도 stripped 파일은 이 호스트의 ELF 배치·정렬 때문에 같은 68,000 B였다. +따라서 파일 크기 개선이라고 보고하지 않는다. 반면 피어는 세그먼트 경계를 넘어 실제 +stripped 파일도 작아졌다. 동적 OpenSSL의 파일·메모리 비용은 여전히 별도이며, 이번 피어 서버 +유휴 RSS 한 번의 관찰은 7,888 KiB였다. 공통 실행 코어 아카이브의 5,932 B 예산 및 CLI가 +libc만 직접 요구하는 성질은 그대로다. + +## 다음에 제거할 중복 + +고정 용량 안에서도 각 인스턴스가 동일한 실행 정의를 **두 벌의 배열 공간에** 보관한다. +이번 변경은 최대 크기 예약을 줄였지만 준비된 명령을 인스턴스 간 공유하지는 않는다. +따라서 많은 독립 앱을 운영하는 다음 검증에서는 불변 프로그램을 공유하고 변경 가능한 상태· +입력 소유권·평가 기록만 인스턴스에 둘 수 있는지 확인해야 한다. 정의 교체의 원자성, +동시 실행의 수명, 스냅샷 호환성을 유지하면서 실제 반복 메모리를 더 줄일 수 있을 때 +구조를 채택한다. 큰 서비스 성능이나 컴파일 시간 우위는 아직 입증하지 않았다. |
