diff options
| author | eunhhu <[email protected]> | 2026-09-24 17:14:54 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-24 17:14:54 +0100 |
| commit | b1ce1927022d374198441afafeb27199fc8a052a (patch) | |
| tree | 6021f175f4c67ed03b44240eaa2f90d846f12f6f /docs/research/039-idle-http-wakeups.md | |
| parent | d34f9426d5317a1948f12f229439946728bc342a (diff) | |
| download | pure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz pure-b1ce1927022d374198441afafeb27199fc8a052a.zip | |
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/039-idle-http-wakeups.md')
| -rw-r--r-- | docs/research/039-idle-http-wakeups.md | 50 |
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`다. |
