feat: 가상화 문서들 추가

This commit is contained in:
DongHyeonka
2026-09-10 08:54:05 +09:00
parent e9f6a93327
commit 43e1aadef0
695 changed files with 153404 additions and 12754 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,250 @@
{
"version": "1.1",
"id": "numa-vcpu-and-memory-placement",
"title": "vCPU 를 Node 0 에 묶어도 backing 이 Node 1 에 있으면 접근은 remote 로 남는다",
"question": "vCPU pinning 만 한 배치와 memory binding 까지 맞춘 배치에서 같은 memory 접근은 각각 어느 node 의 RAM 에 닿는가",
"type": "sequence",
"direction": "LR",
"audience": [
"가상 머신의 지연을 NUMA 배치로 의심하는 사람",
"vCPU pinning 을 걸어 두고 효과가 없다고 느끼는 사람"
],
"summary": "vCPU thread 를 Node 0 CPU 에 pinning 해도 VM1 의 memory backing 이 Node 1 에 놓여 있으면 접근은 remote 로 남고, memory placement 와 binding 까지 Node 0 으로 맞춘 뒤에야 같은 접근이 local 이 된다.",
"alt": "QEMU vCPU Thread, VM1 Memory Backing, Node 0 CPU, Node 0 RAM, Node 1 RAM 다섯 참여자 사이의 순서도. 앞 세 메시지는 pinning 만 한 배치에서 접근이 Node 1 RAM 으로 가는 것을, 뒤 두 메시지는 memory 를 Node 0 에 묶은 배치에서 같은 접근이 Node 0 RAM 으로 가는 것을 보인다.",
"long_description": "참여자는 왼쪽부터 QEMU vCPU Thread, VM1 Memory Backing, Node 0 CPU, Node 0 RAM, Node 1 RAM 다섯이다. 메시지는 위에서 아래로 읽는다. 1번에서 vCPU thread 가 Node 0 CPU 에 pinning 되고, 2번에서 VM1 의 memory backing 이 Node 1 에 놓인다. 그 배치에서 3번의 memory 접근은 Node 1 RAM 으로 가고 이것이 remote access 다. Node 0 과 Node 1 사이에는 interconnect 가 있어 이 접근만 그 구간을 건넌다. 4번과 5번은 그 뒤에 일어나는 다른 사건이 아니라 배치를 고친 구성이다. memory placement 와 binding 까지 Node 0 으로 맞추면 같은 접근이 Node 0 RAM 으로 가고 local access 가 된다. 접근 비용이 실제로 얼마나 차이 나는지, 이 Host 가 몇 개의 node 를 가졌는지는 그림이 말하지 않는다.",
"source_context": {
"document": "docs/virtualization/final/document.md",
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
"anchor": {
"kind": "heading",
"value": "75. vCPU와 NUMA의 연결",
"line": 3313
}
},
"composition": {
"profile": "sequence",
"diagram_only": true,
"reference_ids": [
"payment-approval-sequence"
],
"rationale": "이 절과 다음 절이 세운 것은 배치 하나가 아니라 「묶은 것 → 남은 문제 → 마저 묶은 것 → 달라진 결과」라는 차례다. orchestrator-workers 는 scheduler 를 워커들 위에 두는 그림인데 memory 가 어느 node 에 있는지는 scheduler 가 정하지 않는다는 것이 이 절의 논지라 그 문법을 쓰면 논지가 뒤집힌다. query-fanout 은 CPU 하나가 RAM 둘로 갈라지는 모양은 맞지만 pinning 만 한 배치와 memory 까지 맞춘 배치가 같은 그림에서 구별되지 않는다. sequence 는 메시지에 번호를 붙이므로 두 배치가 어느 쪽이 먼저이고 무엇이 달라졌는지 그대로 드러난다.",
"focus_node": "node0-cpu"
},
"groups": [],
"nodes": [
{
"id": "qemu-vcpu-thread",
"label": "QEMU vCPU Thread",
"kind": "process",
"role": "participant",
"shape": "box",
"emphasis": "primary",
"details": [
"Guest vCPU"
],
"description": "Guest vCPU 가 Host 에서 갖는 실체. Host scheduler 가 이것을 logical CPU 에 올린다.",
"evidence": [
{
"start_line": 3315,
"end_line": 3324
}
],
"assumption": false
},
{
"id": "vm-memory-backing",
"label": "VM1 Memory Backing",
"kind": "memory",
"role": "participant",
"shape": "box",
"details": [
"VM1 RAM"
],
"description": "그 가상 머신의 Host physical backing page 가 놓이는 자리.",
"evidence": [
{
"start_line": 3327,
"end_line": 3327
},
{
"start_line": 3352,
"end_line": 3354
},
{
"start_line": 3381,
"end_line": 3382
}
],
"assumption": false
},
{
"id": "node0-cpu",
"label": "Node 0 CPU",
"kind": "compute",
"role": "participant",
"shape": "box",
"emphasis": "primary",
"details": [
"Host Logical CPU"
],
"description": "vCPU thread 가 실행되는 logical CPU. NUMA Node 0 에 속한다.",
"evidence": [
{
"start_line": 3322,
"end_line": 3330
}
],
"assumption": false
},
{
"id": "node0-ram",
"label": "Node 0 RAM",
"kind": "memory",
"role": "participant",
"shape": "box",
"details": [
"Local Memory"
],
"description": "Node 0 CPU 와 같은 node 의 RAM.",
"evidence": [
{
"start_line": 3288,
"end_line": 3296
},
{
"start_line": 3373,
"end_line": 3382
}
],
"assumption": false
},
{
"id": "node1-ram",
"label": "Node 1 RAM",
"kind": "memory",
"role": "participant",
"shape": "box",
"details": [
"Remote Memory"
],
"description": "다른 node 의 RAM. Node 0 CPU 가 읽으면 interconnect 를 건넌다.",
"evidence": [
{
"start_line": 3299,
"end_line": 3306
},
{
"start_line": 3334,
"end_line": 3334
}
],
"assumption": false
}
],
"edges": [
{
"id": "vcpu-pinning",
"from": "qemu-vcpu-thread",
"to": "node0-cpu",
"label": "vCPU Pinning",
"kind": "control",
"order": 1,
"style": "solid",
"evidence": [
{
"start_line": 3322,
"end_line": 3324
},
{
"start_line": 3347,
"end_line": 3350
}
],
"assumption": false
},
{
"id": "backing-on-node1",
"from": "vm-memory-backing",
"to": "node1-ram",
"label": "Memory Placement",
"kind": "control",
"order": 2,
"style": "solid",
"evidence": [
{
"start_line": 3327,
"end_line": 3327
},
{
"start_line": 3352,
"end_line": 3354
}
],
"assumption": false
},
{
"id": "remote-access",
"from": "node0-cpu",
"to": "node1-ram",
"label": "Remote Access",
"kind": "read",
"order": 3,
"style": "dashed",
"evidence": [
{
"start_line": 3329,
"end_line": 3339
},
{
"start_line": 3356,
"end_line": 3357
}
],
"assumption": false
},
{
"id": "memory-binding",
"from": "vm-memory-backing",
"to": "node0-ram",
"label": "Memory Binding",
"kind": "control",
"order": 4,
"style": "solid",
"evidence": [
{
"start_line": 3361,
"end_line": 3366
},
{
"start_line": 3381,
"end_line": 3382
}
],
"assumption": false
},
{
"id": "local-access",
"from": "node0-cpu",
"to": "node0-ram",
"label": "Local Access",
"kind": "read",
"order": 5,
"style": "solid",
"evidence": [
{
"start_line": 3288,
"end_line": 3296
},
{
"start_line": 3373,
"end_line": 3382
}
],
"assumption": false
}
],
"legend": [],
"metadata": {
"rationale": "sequence 로 고른 이유는 §76 이 배치 하나를 서술한 절이 아니라 「pinning 만 하면 이렇게 되고 memory 까지 맞추면 저렇게 된다」는 차례로 쓰인 절이기 때문이다. 4·5 번은 3 번 뒤에 일어나는 사건이 아니라 고친 구성이고 그 사실은 long_description 과 옆 문단이 말한다. remote access 에 emphasis: warning 을 줬더니 렌더러가 화살표 끝에 빨간 X 를 그려 실패로 읽혔다. remote 는 실패가 아니라 비용이 더 드는 접근이라 강조를 빼고 점선만 남겼다. interconnect 는 그림 안 이름으로 넣지 않고 <desc> 와 노드 설명에 두었다 — 이름이 아니라 두 node 사이의 구간이라 상자도 화살표도 아니다. 접근 비용의 크기와 이 Host 의 node 수는 이 SSOT 가 재지 않았으므로 그리지 않았다."
}
}