diff options
Diffstat (limited to 'docs/research/046-optional-async-document-http.md')
| -rw-r--r-- | docs/research/046-optional-async-document-http.md | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/docs/research/046-optional-async-document-http.md b/docs/research/046-optional-async-document-http.md new file mode 100644 index 0000000..dd3c0a5 --- /dev/null +++ b/docs/research/046-optional-async-document-http.md @@ -0,0 +1,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 지연이 빨라졌다는 주장은 하지 않는다. 기한이 지난 뒤 이미 접수된 쓰기는 +취소되지 않고 커밋될 수 있다. 이는 결과를 받지 못한 클라이언트가 같은 +조건부 버전으로 무조건 재시도하면 안 된다는 뜻이다. 이후 과제는 작업자 +단일성에 묶인 저장소 임시 이름과 직렬화를 재설계하고, 실제 인증 피어까지 +같은 완료·기한 모델을 적용한 뒤 동등한 서버와 지연 분포를 비교하는 것이다. |
