aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/046-optional-async-document-http.md
blob: dd3c0a51bc8cef4da63c7580229284c60a8bed9f (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
# 046 — 실제 HTTP 호스트에서 선택형 비동기 효과 실행

기존 HTTP 문서 호스트는 파일 저장 효과를 이벤트 루프 안에서 실행했다. 저장소의
`fsync`가 지연되면 이미 연결된 다른 클라이언트의 헤더·기한·종료도 처리하지
못한다. [045](045-owner-thread-async-effects.md)의 선택형 완료 계약을 **기존
`editor.pure`와 기존 HTTP 호스트**에 연결했다. 기본 CLI·HTTP는 그대로 단일
스레드와 동기 코어를 사용한다.

`make async-server`는 파일 효과를 하나의 작업자에 넘긴다. 이벤트 루프는
요청 입력·응답 출력·기한·시그널과 `pure_runtime_complete()`를 소유한다.
저장소 코드는 현재 프로세스 안에서 단일 스레드 사용을 전제로 하고
임시 파일 번호를 공유하므로 작업자를 여러 개 띄우지 않았다. 최대 8개 작업
슬롯과 작업자 스택 128 KiB가 이 선택 호스트의 정적 상한이다. 완료 신호에는
이미 사용하던 깨움 파이프를 재사용한다. 연결이 기한 만료나 종료로 사라져도
작업자가 빌린 입력은 완료할 때까지 보존하고, 완료를 소유 스레드에서 회수한다.

[결정적 중단 검사](../../prototypes/connections/results/2026-09-24-async-http/gated.json)는
테스트 전용 저장소 훅으로 파일 동기화 직전 작업자를 멈춘다. 그 동안 두 번째
HTTP 연결의 잘못된 요청은 400으로 응답하고, 첫 연결은 기한에 닫힌다. 작업자를
풀면 저장 완료와 본문 회수가 확인되며, 별도 시나리오에서 종료 신호가 진행 중인
작업의 완료를 기다린다. 작업자가 멈춰 있는 동안 두 번째 **저장 효과**까지
진행된다는 뜻은 아니다. 한 작업자가 효과를 순서대로 처리한다. 테스트 훅은
배포 실행물에 링크되지 않는다. 같은 검사의 [ASan·UBSan 실행](../../prototypes/connections/results/2026-09-24-async-http/sanitized.json)도 통과했다.

기존 [HTTP 정확성 검사](../../prototypes/connections/results/2026-09-24-async-http/full-check.json)를
이 선택 호스트에 다시 적용했다. 이어서
[서비스 작업 원자료](../../prototypes/connections/results/2026-09-24-async-http/service-scale-memory.json)에서
고정 정의·소스 정의·선택형 비동기 소스 정의 호스트를 각각 실제 문서
1,024개, 요청 4,096개, 동시 클라이언트 8개로 실행했다. 세 실행의 최종 문서
해시와 저장 버전이 일치하고, 모두 종료 시 보유 payload 0 B·기한 만료 0건이다.

| Linux AArch64 / GCC 14, 이 작업 | 기존 소스 HTTP | 선택형 비동기 소스 HTTP |
|---|---:|---:|
| 실행물 `text` | 43,778 B | 47,897 B |
| 실행물 `data` | 1,068 B | 1,180 B |
| 서버 구조체 | 41,528 B | 43,224 B |
| 유휴 프로세스 RSS | 1,536 KiB | 1,536 KiB |
| 이 작업의 피크 RSS | 1,712 KiB | 1,712 KiB |
| 유휴 가상주소 공간 | 2,464 KiB | 2,656 KiB |
| 이 작업의 피크 가상주소 공간 | 2,528 KiB | 2,736 KiB |
| 프로세스 스레드 | 1 | 2 |

RSS의 동일한 숫자는 이 표본에서의 관측값이며 비동기 호스트의 일반적인
메모리 우위를 뜻하지 않는다. 작업자 스택과 저장소 파일·페이지 캐시·커널
소켓 버퍼는 실행물의 코드 섹션에 포함되지 않는다. [크기 상한 검사](../../prototypes/connections/results/2026-09-24-async-http/profile.json)는
선택 호스트 `text` 48 KiB 이내와 직접 동적 의존성을 확인한다. 기본 HTTP의
`text`는 여전히 43,778 B이고 `make check-release`가 통과했다.

이 단계는 저장소의 지연이 **이벤트 루프 전체를 멈추지 않는 것**과 그 비용을
입증한다. 단일 작업자가 모든 저장 효과를 직렬화하므로 효과 처리량이나
RPC 지연이 빨라졌다는 주장은 하지 않는다. 기한이 지난 뒤 이미 접수된 쓰기는
취소되지 않고 커밋될 수 있다. 이는 결과를 받지 못한 클라이언트가 같은
조건부 버전으로 무조건 재시도하면 안 된다는 뜻이다. 이후 과제는 작업자
단일성에 묶인 저장소 임시 이름과 직렬화를 재설계하고, 실제 인증 피어까지
같은 완료·기한 모델을 적용한 뒤 동등한 서버와 지연 분포를 비교하는 것이다.