refactor: 문서 개선 중

This commit is contained in:
donghyeon-ka
2026-09-21 14:30:55 +09:00
parent c93cdea150
commit 805a18f486
1497 changed files with 525837 additions and 59152 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -4,7 +4,7 @@
"title": "가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다",
"question": "서로 다른 곳에서 시작한 I/O 는 어디에서 하나로 모여 device 로 나가는가",
"type": "flow",
"direction": "TB",
"direction": "LR",
"audience": [
"가상 머신 위에서 본 저장소 지연의 원인을 가르려는 사람",
"Storage Contention 과 CPU Contention 을 나눠 재려는 사람"
@@ -14,11 +14,11 @@
"long_description": "위쪽에 네 출발점이 나란히 있다. VM1 QEMU 는 WRITE X 와 READ Y, WRITE Z 를 내고 VM2 QEMU 는 READ A 와 WRITE B 를 내며, 그 옆에 호스트의 Nginx 와 다른 프로세스가 있다. 네 갈래가 모두 가운데의 Host Block Layer 하나로 모인다. Host Block Layer 는 그 I/O 가 가상 머신 안에서 시작했는지 호스트 프로세스에서 시작했는지를 본질적으로 구분해 처리하는 계층이 아니라 들어온 것을 모두 Host block request 로 다루고, 그 요청들을 queue 에서 관리해 맨 아래 NVMe 로 dispatch 한다. 여기서 생기는 경쟁이 Storage Contention 이고 CPU 실행 시간을 두고 벌어지는 CPU Contention 과는 다투는 자원이 다르다는 것은 본문 문단이 맡는다.",
"source_context": {
"document": "docs/virtualization/final/document.md",
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
"document_sha256": "8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210",
"anchor": {
"kind": "heading",
"value": "159. 여러 VM이 하나의 NVMe를 공유하면",
"line": 7026
"line": 7039
}
},
"composition": {
@@ -46,12 +46,12 @@
"description": "가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다.",
"evidence": [
{
"start_line": 7029,
"end_line": 7029
"start_line": 7042,
"end_line": 7042
},
{
"start_line": 7041,
"end_line": 7044
"start_line": 7054,
"end_line": 7057
}
],
"assumption": false
@@ -69,12 +69,12 @@
"description": "다른 가상 머신의 QEMU 프로세스.",
"evidence": [
{
"start_line": 7031,
"end_line": 7031
"start_line": 7044,
"end_line": 7044
},
{
"start_line": 7046,
"end_line": 7048
"start_line": 7059,
"end_line": 7061
}
],
"assumption": false
@@ -88,8 +88,8 @@
"description": "호스트에서 직접 도는 프로세스.",
"evidence": [
{
"start_line": 7033,
"end_line": 7033
"start_line": 7046,
"end_line": 7046
}
],
"assumption": false
@@ -103,8 +103,8 @@
"description": "그 밖의 호스트 프로세스.",
"evidence": [
{
"start_line": 7035,
"end_line": 7038
"start_line": 7048,
"end_line": 7051
}
],
"assumption": false
@@ -123,20 +123,20 @@
"description": "어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다.",
"evidence": [
{
"start_line": 7031,
"end_line": 7031
"start_line": 7044,
"end_line": 7044
},
{
"start_line": 7017,
"end_line": 7022
"start_line": 7030,
"end_line": 7035
},
{
"start_line": 7054,
"end_line": 7054
"start_line": 7067,
"end_line": 7067
},
{
"start_line": 7058,
"end_line": 7060
"start_line": 7071,
"end_line": 7073
}
],
"assumption": false
@@ -150,16 +150,16 @@
"description": "네 갈래가 결국 함께 쓰는 하나의 물리 device.",
"evidence": [
{
"start_line": 7031,
"end_line": 7031
"start_line": 7044,
"end_line": 7044
},
{
"start_line": 7019,
"end_line": 7019
"start_line": 7032,
"end_line": 7032
},
{
"start_line": 7066,
"end_line": 7069
"start_line": 7079,
"end_line": 7082
}
],
"assumption": false
@@ -176,8 +176,8 @@
"order": 1,
"evidence": [
{
"start_line": 7029,
"end_line": 7031
"start_line": 7042,
"end_line": 7044
}
],
"assumption": false
@@ -192,8 +192,8 @@
"order": 2,
"evidence": [
{
"start_line": 7031,
"end_line": 7031
"start_line": 7044,
"end_line": 7044
}
],
"assumption": false
@@ -208,8 +208,8 @@
"order": 3,
"evidence": [
{
"start_line": 7031,
"end_line": 7033
"start_line": 7044,
"end_line": 7046
}
],
"assumption": false
@@ -224,8 +224,8 @@
"order": 4,
"evidence": [
{
"start_line": 7031,
"end_line": 7035
"start_line": 7044,
"end_line": 7048
}
],
"assumption": false
@@ -240,12 +240,12 @@
"order": 5,
"evidence": [
{
"start_line": 7031,
"end_line": 7031
"start_line": 7044,
"end_line": 7044
},
{
"start_line": 7054,
"end_line": 7054
"start_line": 7067,
"end_line": 7067
}
],
"assumption": false
@@ -253,6 +253,6 @@
],
"legend": [],
"metadata": {
"rationale": "component-flow 를 고른 이유는 이 절이 답하는 물음이 「여러 곳에서 온 요청이 어디에서 하나가 되는가」이기 때문이고, 그 수렴은 자리로만 보인다. 네 출발점의 화살표에는 라벨을 달지 않았다 — 넷이 같은 Host block request」라는 것이 이 그림의 논지인데 같은 라벨을 네 번 겹쳐 놓으면 라벨끼리 먹힌다. 그래서 그 이름은 모이는 노드의 details 로 올렸다. blk-mq 도 노드가 아니라 details 다 — §160 이 그리는 것은 CPU 넷이 자기 queue 를 갖는 다른 수렴이라 이 그림의 네 출발점과 같은 축에 놓을 수 없다. I/O Scheduler 와 NVMe Driver 는 §161 과 §164 가 대는 사실인데 이 앵커의 준비된 문맥(§158~§160) 밖이라 넣지 않았다. §159 의 「Host Process READ C」도 붙이지 않았다 — 그 프로세스가 Nginx 인지 Host 기타인지 SSOT 가 말하지 않는다."
"rationale": "component-flow 를 고른 이유는 이 절이 답하는 물음이 「여러 곳에서 온 요청이 어디에서 하나가 되는가」이기 때문이다. 현재 renderer에서는 LR로 두어 네 출발점이 Host Block Layer 로 수렴하는 선을 상자 충돌 없이 보이게 한다. 네 출발점의 화살표에는 같은 Host block request 라벨을 반복하지 않고 그 의미를 모이는 노드의 details 로 올렸다. blk-mq 와 I/O Scheduler 의 세부는 다른 절이 맡는다."
}
}