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
@@ -0,0 +1,25 @@
# vCPU 를 Node 0 에 묶어도 backing 이 Node 1 에 있으면 접근은 remote 로 남는다
## Alternative text
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 를 가졌는지는 그림이 말하지 않는다.
## Elements and evidence
- **QEMU vCPU Thread** (process): Guest vCPU 가 Host 에서 갖는 실체. Host scheduler 가 이것을 logical CPU 에 올린다. Evidence: L3315L3324.
- **VM1 Memory Backing** (memory): 그 가상 머신의 Host physical backing page 가 놓이는 자리. Evidence: L3327L3327, L3352L3354, L3381L3382.
- **Node 0 CPU** (compute): vCPU thread 가 실행되는 logical CPU. NUMA Node 0 에 속한다. Evidence: L3322L3330.
- **Node 0 RAM** (memory): Node 0 CPU 와 같은 node 의 RAM. Evidence: L3288L3296, L3373L3382.
- **Node 1 RAM** (memory): 다른 node 의 RAM. Node 0 CPU 가 읽으면 interconnect 를 건넌다. Evidence: L3299L3306, L3334L3334.
## Relationships
- **QEMU vCPU Thread → Node 0 CPU:** vCPU Pinning. Evidence: L3322L3324, L3347L3350.
- **VM1 Memory Backing → Node 1 RAM:** Memory Placement. Evidence: L3327L3327, L3352L3354.
- **Node 0 CPU → Node 1 RAM:** Remote Access. Evidence: L3329L3339, L3356L3357.
- **VM1 Memory Backing → Node 0 RAM:** Memory Binding. Evidence: L3361L3366, L3381L3382.
- **Node 0 CPU → Node 0 RAM:** Local Access. Evidence: L3288L3296, L3373L3382.
@@ -0,0 +1,23 @@
# vCPU 를 Node 0 에 묶어도 backing 이 Node 1 에 있으면 접근은 remote 로 남는다
# Question: vCPU pinning 만 한 배치와 memory binding 까지 맞춘 배치에서 같은 memory 접근은 각각 어느 node 의 RAM 에 닿는가
direction: right
n0: "QEMU vCPU Thread" {
shape: rectangle
}
n1: "VM1 Memory Backing" {
shape: rectangle
}
n2: "Node 0 CPU" {
shape: rectangle
}
n3: "Node 0 RAM" {
shape: rectangle
}
n4: "Node 1 RAM" {
shape: rectangle
}
n0 -> n2: "vCPU Pinning"
n1 -> n4: "Memory Placement"
n2 -> n4: "Remote Access"
n1 -> n3: "Memory Binding"
n2 -> n3: "Local Access"
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" modified="2026-07-23T00:00:00.000Z" agent="techviz-harness" version="24.7.17" type="device">
<diagram id="numa-vcpu-and-memory-placement" name="vCPU 를 Node 0 에 묶어도 backing 이 Node 1 에 있으면 접근은 remote 로 남는다">
<mxGraphModel dx="1080" dy="480" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1080" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="n_qemu-vcpu-thread" value="QEMU vCPU Thread&lt;br/&gt;Guest vCPU" tooltip="Guest vCPU 가 Host 에서 갖는 실체. Host scheduler 가 이것을 logical CPU 에 올린다. | Evidence: L3315-L3324" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="45.0" y="35.0" width="150.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="n_vm-memory-backing" value="VM1 Memory Backing&lt;br/&gt;VM1 RAM" tooltip="그 가상 머신의 Host physical backing page 가 놓이는 자리. | Evidence: L3327-L3327, L3352-L3354, L3381-L3382" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="255.0" y="35.0" width="160.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="n_node0-cpu" value="Node 0 CPU&lt;br/&gt;Host Logical CPU" tooltip="vCPU thread 가 실행되는 logical CPU. NUMA Node 0 에 속한다. | Evidence: L3322-L3330" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="465.0" y="35.0" width="150.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="n_node0-ram" value="Node 0 RAM&lt;br/&gt;Local Memory" tooltip="Node 0 CPU 와 같은 node 의 RAM. | Evidence: L3288-L3296, L3373-L3382" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="675.0" y="35.0" width="150.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="n_node1-ram" value="Node 1 RAM&lt;br/&gt;Remote Memory" tooltip="다른 node 의 RAM. Node 0 CPU 가 읽으면 interconnect 를 건넌다. | Evidence: L3299-L3306, L3334-L3334" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="885.0" y="35.0" width="150.0" height="71.0" as="geometry"/>
</mxCell>
<mxCell id="e_vcpu-pinning" value="vCPU Pinning" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_qemu-vcpu-thread" target="n_node0-cpu">
<mxGeometry relative="1" as="geometry">
<mxPoint x="330.0" y="128.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_backing-on-node1" value="Memory Placement" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_vm-memory-backing" target="n_node1-ram">
<mxGeometry relative="1" as="geometry">
<mxPoint x="647.5" y="190.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_remote-access" value="Remote Access" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_node0-cpu" target="n_node1-ram">
<mxGeometry relative="1" as="geometry">
<mxPoint x="750.0" y="252.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_memory-binding" value="Memory Binding" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_vm-memory-backing" target="n_node0-ram">
<mxGeometry relative="1" as="geometry">
<mxPoint x="542.5" y="314.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_local-access" value="Local Access" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_node0-cpu" target="n_node0-ram">
<mxGeometry relative="1" as="geometry">
<mxPoint x="645.0" y="376.0" as="offset"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
@@ -0,0 +1,813 @@
{
"type": "excalidraw",
"version": 2,
"source": "techviz-harness",
"elements": [
{
"id": "edge-vcpu-pinning",
"type": "arrow",
"x": 120.0,
"y": 140.0,
"width": 420.0,
"height": 0.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 62242264,
"version": 1,
"versionNonce": 1499099216,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
420.0,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-qemu-vcpu-thread",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-node0-cpu",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-vcpu-pinning",
"type": "text",
"x": 282.0,
"y": 116.0,
"width": 96,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1253222705,
"version": 1,
"versionNonce": 1692022138,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "vCPU Pinning",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "vCPU Pinning",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-backing-on-node1",
"type": "arrow",
"x": 335.0,
"y": 202.0,
"width": 625.0,
"height": 0.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 597976500,
"version": 1,
"versionNonce": 751236157,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
625.0,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-vm-memory-backing",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-node1-ram",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-backing-on-node1",
"type": "text",
"x": 583.5,
"y": 178.0,
"width": 128,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 190361474,
"version": 1,
"versionNonce": 659971302,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "Memory Placement",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Memory Placement",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-remote-access",
"type": "arrow",
"x": 540.0,
"y": 264.0,
"width": 420.0,
"height": 0.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 723638991,
"version": 1,
"versionNonce": 805387919,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
420.0,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-node0-cpu",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-node1-ram",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-remote-access",
"type": "text",
"x": 698.0,
"y": 240.0,
"width": 104,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 849395583,
"version": 1,
"versionNonce": 207564235,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "Remote Access",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Remote Access",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-memory-binding",
"type": "arrow",
"x": 335.0,
"y": 326.0,
"width": 415.0,
"height": 0.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 196285201,
"version": 1,
"versionNonce": 1908442994,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
415.0,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-vm-memory-backing",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-node0-ram",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-memory-binding",
"type": "text",
"x": 486.5,
"y": 302.0,
"width": 112,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 34697980,
"version": 1,
"versionNonce": 231604789,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "Memory Binding",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Memory Binding",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-local-access",
"type": "arrow",
"x": 540.0,
"y": 388.0,
"width": 210.0,
"height": 0.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 206481616,
"version": 1,
"versionNonce": 1350583922,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
210.0,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-node0-cpu",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-node0-ram",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-local-access",
"type": "text",
"x": 597.0,
"y": 364.0,
"width": 96,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 34733324,
"version": 1,
"versionNonce": 425512157,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "Local Access",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Local Access",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-qemu-vcpu-thread",
"type": "rectangle",
"x": 45.0,
"y": 35.0,
"width": 150.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1825553164,
"version": 1,
"versionNonce": 1401023854,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-qemu-vcpu-thread",
"type": "text",
"x": 55.0,
"y": 45.0,
"width": 130.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1778333500,
"version": 1,
"versionNonce": 1378313554,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "QEMU vCPU Thread\nGuest vCPU",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "QEMU vCPU Thread\nGuest vCPU",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-vm-memory-backing",
"type": "rectangle",
"x": 255.0,
"y": 35.0,
"width": 160.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1737545018,
"version": 1,
"versionNonce": 1015012347,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-vm-memory-backing",
"type": "text",
"x": 265.0,
"y": 45.0,
"width": 140.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1698958649,
"version": 1,
"versionNonce": 994477758,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "VM1 Memory Backing\nVM1 RAM",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "VM1 Memory Backing\nVM1 RAM",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-node0-cpu",
"type": "rectangle",
"x": 465.0,
"y": 35.0,
"width": 150.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 932582931,
"version": 1,
"versionNonce": 1817086514,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-node0-cpu",
"type": "text",
"x": 475.0,
"y": 45.0,
"width": 130.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 191003957,
"version": 1,
"versionNonce": 1993112408,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "Node 0 CPU\nHost Logical CPU",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Node 0 CPU\nHost Logical CPU",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-node0-ram",
"type": "rectangle",
"x": 675.0,
"y": 35.0,
"width": 150.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 107670886,
"version": 1,
"versionNonce": 1647932318,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-node0-ram",
"type": "text",
"x": 685.0,
"y": 45.0,
"width": 130.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1867132934,
"version": 1,
"versionNonce": 938518424,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "Node 0 RAM\nLocal Memory",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Node 0 RAM\nLocal Memory",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-node1-ram",
"type": "rectangle",
"x": 885.0,
"y": 35.0,
"width": 150.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1430922658,
"version": 1,
"versionNonce": 633973815,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-node1-ram",
"type": "text",
"x": 895.0,
"y": 45.0,
"width": 130.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 608261168,
"version": 1,
"versionNonce": 116561591,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "Node 1 RAM\nRemote Memory",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Node 1 RAM\nRemote Memory",
"autoResize": true,
"lineHeight": 1.25
}
],
"appState": {
"gridSize": 10,
"viewBackgroundColor": "#ffffff",
"currentItemFontFamily": 5
},
"files": {}
}
@@ -0,0 +1,31 @@
{
"harness_version": "0.2.0",
"spec_id": "numa-vcpu-and-memory-placement",
"spec_version": "1.1",
"spec_sha256": "afeb9cbc8d7063a1945cabb916eadab7d248a252fce57e433355e6c679090bd5",
"source_context": {
"document": "docs/virtualization/final/document.md",
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
"anchor": {
"kind": "heading",
"value": "75. vCPU와 NUMA의 연결",
"line": 3313
}
},
"outputs": [
"numa-vcpu-and-memory-placement.svg",
"numa-vcpu-and-memory-placement.drawio",
"numa-vcpu-and-memory-placement.mmd",
"numa-vcpu-and-memory-placement.d2",
"numa-vcpu-and-memory-placement.excalidraw",
"numa-vcpu-and-memory-placement.alt.md"
],
"lint_issue_count": 0,
"assumption_count": 0,
"assumptions_allowed": false,
"composition_profile": "sequence",
"reference_ids": [
"payment-approval-sequence"
],
"diagram_only": true
}
@@ -0,0 +1,13 @@
%% vCPU 를 Node 0 에 묶어도 backing 이 Node 1 에 있으면 접근은 remote 로 남는다
%% question: vCPU pinning 만 한 배치와 memory binding 까지 맞춘 배치에서 같은 memory 접근은 각각 어느 node 의 RAM 에 닿는가
sequenceDiagram
participant n0 as QEMU vCPU Thread
participant n1 as VM1 Memory Backing
participant n2 as Node 0 CPU
participant n3 as Node 0 RAM
participant n4 as Node 1 RAM
n0->>n2: vCPU Pinning
n1->>n4: Memory Placement
n2->>n4: Remote Access
n1->>n3: Memory Binding
n2->>n3: Local Access
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1080" height="480" viewBox="0 0 1080 480" role="img" aria-labelledby="diagram-title diagram-description">
<title id="diagram-title">vCPU 를 Node 0 에 묶어도 backing 이 Node 1 에 있으면 접근은 remote 로 남는다</title>
<desc id="diagram-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 를 가졌는지는 그림이 말하지 않는다.</desc>
<metadata>{&quot;techviz&quot;:{&quot;spec_version&quot;:&quot;1.1&quot;,&quot;id&quot;:&quot;numa-vcpu-and-memory-placement&quot;,&quot;profile&quot;:&quot;sequence&quot;},&quot;source_context&quot;:{&quot;document&quot;:&quot;docs/virtualization/final/document.md&quot;,&quot;document_sha256&quot;:&quot;181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd&quot;,&quot;anchor&quot;:{&quot;kind&quot;:&quot;heading&quot;,&quot;value&quot;:&quot;75. vCPU와 NUMA의 연결&quot;,&quot;line&quot;:3313}},&quot;evidence_policy&quot;:&quot;Each factual element cites source lines or is marked assumption.&quot;,&quot;diagram_only&quot;:true}</metadata>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" />
</marker>
<style>
:root { color-scheme: light; }
text { font-family: Inter, Pretendard, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; fill: #111827; }
.canvas { fill: #ffffff; }
.group-box { fill: #ffffff; stroke: #9ca3af; stroke-width: 1.4; stroke-dasharray: 7 5; }
.group-label-bg { fill: #ffffff; }
.group-label { font-size: 13px; font-weight: 650; fill: #374151; }
.edge { fill: none; stroke: #374151; stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; marker-end: url(#arrow); }
.edge.style-dashed, .edge.semantic-dashed, .edge.assumption { stroke-dasharray: 7 5; }
.edge.style-dotted { stroke-dasharray: 2 5; }
.edge.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
.edge.emphasis-muted { stroke: #9ca3af; }
.edge.emphasis-warning, .edge.kind-failure, .edge.kind-error { stroke: #dc2626; stroke-width: 2.2; }
.edge-label-bg { fill: #ffffff; }
.edge-label { font-size: 12px; font-weight: 560; text-anchor: middle; }
.node-shape { fill: #ffffff; stroke: #4b5563; stroke-width: 1.7; }
.node-shape.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
.node-shape.emphasis-muted { stroke: #9ca3af; fill: #f9fafb; }
.node-shape.emphasis-warning { stroke: #d97706; stroke-width: 2; fill: #fffdf5; }
.node-shape.kind-database, .node-shape.kind-datastore, .node-shape.kind-storage { fill: #f8fafc; }
.node-shape.kind-queue, .node-shape.kind-event, .node-shape.kind-topic { fill: #fafafa; }
.node-shape.assumption { stroke-dasharray: 4 4; }
.storage-bottom, .controller-divider { fill: none; stroke: #4b5563; stroke-width: 1.4; }
.controller-led { fill: #4b5563; }
.actor-symbol { fill: none; stroke: #4b5563; stroke-width: 1.8; stroke-linecap: round; }
.actor-symbol.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
.node-label { font-size: 14px; font-weight: 650; text-anchor: middle; }
.node-role { font-size: 10px; letter-spacing: 0.04em; text-anchor: middle; fill: #6b7280; }
.node-detail-divider { stroke: #d1d5db; stroke-width: 1; }
.node-detail { font-size: 11px; fill: #374151; }
.assumption-badge { font-size: 9px; font-weight: 700; fill: #92400e; }
.failure-mark { stroke: #dc2626; stroke-width: 4; stroke-linecap: round; }
.lifeline { stroke: #9ca3af; stroke-width: 1.2; stroke-dasharray: 5 5; }
.timeline-axis { stroke: #374151; stroke-width: 1.8; marker-end: url(#arrow); }
.timeline-stem { stroke: #6b7280; stroke-width: 1.3; }
.timeline-marker { fill: #ffffff; stroke: #374151; stroke-width: 1.7; }
.timeline-marker.primary { fill: #2563eb; stroke: #2563eb; }
.timeline-marker.warning { fill: #dc2626; stroke: #dc2626; }
.timeline-label { font-size: 13px; font-weight: 650; text-anchor: middle; }
.timeline-detail { font-size: 11px; fill: #4b5563; text-anchor: middle; }
</style>
</defs>
<rect class="canvas" width="1080" height="480" />
<rect class="node-shape kind-process emphasis-primary role-participant" data-evidence="3315-3324" x="45.0" y="35.0" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="120.0" y="62.0">QEMU vCPU Thread</text>
<line class="node-detail-divider" x1="59.0" y1="83.0" x2="181.0" y2="83.0" />
<text class="node-detail" x="61.0" y="100.0">Guest vCPU</text>
<line class="lifeline" x1="120.0" y1="106.0" x2="120.0" y2="450.0" />
<rect class="node-shape kind-memory emphasis-normal role-participant" data-evidence="3327-3327,3352-3354,3381-3382" x="255.0" y="35.0" width="160.0" height="71.0" rx="7" />
<text class="node-label" x="335.0" y="62.0">VM1 Memory Backing</text>
<line class="node-detail-divider" x1="269.0" y1="83.0" x2="401.0" y2="83.0" />
<text class="node-detail" x="271.0" y="100.0">VM1 RAM</text>
<line class="lifeline" x1="335.0" y1="106.0" x2="335.0" y2="450.0" />
<rect class="node-shape kind-compute emphasis-primary role-participant" data-evidence="3322-3330" x="465.0" y="35.0" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="540.0" y="62.0">Node 0 CPU</text>
<line class="node-detail-divider" x1="479.0" y1="83.0" x2="601.0" y2="83.0" />
<text class="node-detail" x="481.0" y="100.0">Host Logical CPU</text>
<line class="lifeline" x1="540.0" y1="106.0" x2="540.0" y2="450.0" />
<rect class="node-shape kind-memory emphasis-normal role-participant" data-evidence="3288-3296,3373-3382" x="675.0" y="35.0" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="750.0" y="62.0">Node 0 RAM</text>
<line class="node-detail-divider" x1="689.0" y1="83.0" x2="811.0" y2="83.0" />
<text class="node-detail" x="691.0" y="100.0">Local Memory</text>
<line class="lifeline" x1="750.0" y1="106.0" x2="750.0" y2="450.0" />
<rect class="node-shape kind-memory emphasis-normal role-participant" data-evidence="3299-3306,3334-3334" x="885.0" y="35.0" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="960.0" y="62.0">Node 1 RAM</text>
<line class="node-detail-divider" x1="899.0" y1="83.0" x2="1021.0" y2="83.0" />
<text class="node-detail" x="901.0" y="100.0">Remote Memory</text>
<line class="lifeline" x1="960.0" y1="106.0" x2="960.0" y2="450.0" />
<polyline class="edge kind-control style-solid emphasis-normal" points="120.0,140.0 540.0,140.0" data-evidence="3322-3324,3347-3350" />
<rect class="edge-label-bg" x="270.8" y="114.0" width="118.5" height="22" rx="3" />
<text class="edge-label" x="330.0" y="129.0">1. vCPU Pinning</text>
<polyline class="edge kind-control style-solid emphasis-normal" points="335.0,202.0 960.0,202.0" data-evidence="3327-3327,3352-3354" />
<rect class="edge-label-bg" x="574.9" y="176.0" width="145.3" height="22" rx="3" />
<text class="edge-label" x="647.5" y="191.0">2. Memory Placement</text>
<polyline class="edge kind-read style-dashed emphasis-normal" points="540.0,264.0 960.0,264.0" data-evidence="3329-3339,3356-3357" />
<rect class="edge-label-bg" x="687.4" y="238.0" width="125.2" height="22" rx="3" />
<text class="edge-label" x="750.0" y="253.0">3. Remote Access</text>
<polyline class="edge kind-control style-solid emphasis-normal" points="335.0,326.0 750.0,326.0" data-evidence="3361-3366,3381-3382" />
<rect class="edge-label-bg" x="476.6" y="300.0" width="131.9" height="22" rx="3" />
<text class="edge-label" x="542.5" y="315.0">4. Memory Binding</text>
<polyline class="edge kind-read style-solid emphasis-normal" points="540.0,388.0 750.0,388.0" data-evidence="3288-3296,3373-3382" />
<rect class="edge-label-bg" x="585.8" y="362.0" width="118.5" height="22" rx="3" />
<text class="edge-label" x="645.0" y="377.0">5. Local Access</text>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB