aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/039-idle-http-wakeups.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/research/039-idle-http-wakeups.md')
-rw-r--r--docs/research/039-idle-http-wakeups.md50
1 files changed, 50 insertions, 0 deletions
diff --git a/docs/research/039-idle-http-wakeups.md b/docs/research/039-idle-http-wakeups.md
new file mode 100644
index 0000000..f958aec
--- /dev/null
+++ b/docs/research/039-idle-http-wakeups.md
@@ -0,0 +1,50 @@
+# 039 — 유휴 HTTP 호스트의 주기적 깨움 제거
+
+후속 [041](041-posix-idle-signal-wakeup.md)에서 Linux 전용 `ppoll` 경로를
+POSIX 신호 알림 파이프로 교체했다. 아래 수치와 묶음은 그 전 단계의 기록이다.
+
+2026-09-24. [038](038-fixed-http-document-host.md)의 문서 HTTP 호스트는
+연결이 없어도 `poll(..., 50)`을 반복했다. 마이크로 런타임에서는 상시 실행
+서비스의 유휴 CPU 깨움도 비용이다. 이번 변경은 사용 중인 연결들의 가장
+이른 절대 기한까지 기다리고, 연결이 없으면 새 접속이나 종료 신호가 올 때까지
+블로킹한다. 전용 타이머 스레드, 실행 코어 타입, 추가 큐를 만들지 않았다.
+종료 신호가 대기 직전에 도착하는 경합을 막기 위해 Linux 호스트는
+`SIGINT`·`SIGTERM`을 평소에 보류하고 `ppoll`이 대기할 때 원자적으로
+해제한다. 신호는 대기를 깨우며, 다음 루프에서 종료 상태를 확인한다.
+
+[시스템 호출 비교](../../prototypes/connections/results/2026-09-24-signal-safe-idle/reproducible-comparison.json)는
+같은 Linux AArch64 호스트에서 연결 없는 1.25초를 관찰했다. 보관된
+[이전 고정 HTTP 묶음](../../prototypes/connections/results/2026-09-24-fixed-http/pure-document-fixed-http-linux-aarch64.tar.gz)의
+호스트는 **50ms 제한의 `ppoll` 25회**, 새 호스트는 **제한 시간 없는 대기
+1회**였다. 비교기는 보관된 패키지의 실행물을 직접 추출해 추적하므로
+임시 빌드나 기억에 의존하지 않는다. 이는 시스템 호출·깨움 횟수에 대한
+실측이며 배터리 소모량이나 처리량 비교는 아니다.
+
+활성 연결이 있으면 각 연결의 절대 기한 중 가장 가까운 값으로 대기 시간을
+정한다. 이미 지난 기한은 즉시 처리한다. 기존 소스 정의 HTTP 검사 `make check-release`는
+1.2초 기한의 느린 수신자·여덟 개 불완전한 헤더 연결을 회수하는 경로를
+포함해 통과했다. [고정 정의 HTTP 회귀 검사](../../prototypes/connections/results/2026-09-24-signal-safe-idle/fixed-server-regression.json)도
+1 MiB 문서 교차 송수신, 느린 수신자의 예산 점유·회수와 4 MiB 프로세스
+피크 상한을 통과했다. 유휴 블로킹 중 `SIGTERM`이 대기를 깨우고 정상
+종료하는 것도 비교 추적에서 확인했다.
+
+링크된 `text`는 소스 HTTP 43,009→**43,451 B**, 고정 HTTP
+25,228→**25,790 B**로 증가했다. 앞선 대기 변경만으로는 각각 64 B가
+늘었지만, 종료 신호 경합까지 막은 최종 비용은 각각 442 B와 562 B다.
+실행 코어 5,932 B와 기본 CLI는 그대로다.
+[소스 호스트 크기](../../prototypes/connections/results/2026-09-24-signal-safe-idle/source-profile.json)와
+[고정 호스트 크기](../../prototypes/connections/results/2026-09-24-signal-safe-idle/fixed-profile.json)는
+각각 기존 상한을 통과했다. [새 CLI+HTTP 묶음](../../prototypes/connections/results/2026-09-24-signal-safe-idle/pure-document-fixed-http-linux-aarch64.tar.gz)은
+32,023 B이고 [다른 위치에서의 편집·복원](../../prototypes/connections/results/2026-09-24-signal-safe-idle/package.json)을
+통과했다. 패키지에는 시스템 libc가 포함되지 않는다.
+
+이 결과는 **Linux 호스트의 유휴 폴링 제거**다. `ppoll` 신호 마스크는
+Linux 구현이므로 다른 플랫폼의 대기·종료 경로, 실제 전력, 높은 동시성의 지연·처리량과 큰 앱 표현은
+아직 검증하지 않았다. 서비스가 연결을 처리할 때 저장 효과는 여전히
+동기식이므로 이 변경으로 그것이 비동기가 되지는 않는다.
+
+재현 명령은
+`python3 prototypes/connections/check_idle_wakes.py --before
+prototypes/connections/results/2026-09-24-fixed-http/pure-document-fixed-http-linux-aarch64.tar.gz
+--after prototypes/connections/build/pure-connections-fixed`,
+`make -C prototypes/connections check-release check-fixed-profile check-fixed-server`다.