aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/research/075-http-host-against-axum.md22
1 files changed, 22 insertions, 0 deletions
diff --git a/docs/research/075-http-host-against-axum.md b/docs/research/075-http-host-against-axum.md
index 8630fb3..ab26a37 100644
--- a/docs/research/075-http-host-against-axum.md
+++ b/docs/research/075-http-host-against-axum.md
@@ -102,3 +102,25 @@ PUT은 연결마다 자기 키 앞에 16 B를 넣고 받은 ETag로 다음 `If-M
ThreadSanitizer는 이 커널(47비트 가상 주소)을 지원하지 않아 쓰지 못했다. 스레드 동시 커밋은 ASan 빌드의 저장소
검사(스레드 넷이 각자와 공유 키에 동시 커밋)와 aup의 3샤드 서버 검사로 확인한다.
+
+## 3단계: 샤드 간 그룹 커밋과 무복사 읽기
+
+- **그룹 커밋.** 같은 때 커밋하는 스레드들은 한 커밋을 나눠 쓴다. 먼저 온 스레드가 리더가 되어 줄 선 요청을 한
+ head로 공개하고 나머지는 결과를 기다린다. 요청 단위의 원자성은 그대로다(낡은 draft가 있는 요청이나, 같은 그룹의
+ 앞 요청이 바꾼 키를 옛 리비전으로 고치려는 요청은 빠진다). 여러 스레드가 함께 커밋해 왔다면 리더는 최근 그룹
+ 크기만큼 모일 때까지 최대 2 ms 기다린다. 공개를 멈춘 사이 커밋 다섯 건이 정확히 공개 두 번이 되는지 검사한다.
+ 세 샤드, 쓰는 연결 8개에서 묶음 1,234개가 공개 421번으로 나갔다(1스레드와 처리량이 같아졌다: 327/s 대 348/s).
+- **무복사 읽기.** 저장된 문서를 읽는 응답은 복사하지 않고 저장소 매핑의 익스텐트를 `writev`로 빌려준다. 매핑
+ 참조(`pure_draft_mapping`)를 응답이 끝날 때까지 쥐므로, 보내는 도중 문서가 바뀌거나 파일이 압축으로 교체돼도
+ 읽은 버전 그대로 나간다(aup 검사: 1 MiB를 느린 소켓으로 보내는 동안 다섯 번 바꾼다).
+
+| 작업 | pure-serve 1스레드 | pure-serve 3샤드 | axum 메모리 | axum 충돌 안전 |
+|---|---:|---:|---:|---:|
+| GET 64 B, keep-alive | **127,802** (p99 544) | **151,620** (p99 608) | 125,690 (p99 768) | 126,903 |
+| GET 1 MiB, keep-alive | **2,761** | 1,884 | 1,380 | 1,446 |
+
+1 MiB 읽기는 axum의 약 2배(초당 약 2.9 GB)이고, 이 속도에서는 코어 하나로 받는 부하 생성기가 병목에 가깝다.
+
+**저장 보장 쓰기 측정의 함정.** 저장 장치는 SD 카드 하나뿐이고, 동기 쓰기가 몇 분 이어지면 내부 정리로 크게 느려진다
+(같은 설정이 순서에 따라 연결 8개에서 350/s → 17/s, p99 4.4초). 앞의 표들의 쓰기 수치는 순서 영향을 받았다. 쓰기 비교는
+설정 순서를 섞어 여러 번 돌리고, 매번 장치의 fsync 지연을 함께 재서 보고해야 한다(다음 작업).