refactor: 문서 개선 중
This commit is contained in:
+11
-11
@@ -10,17 +10,17 @@ VM1 QEMU, VM2 QEMU, Nginx, Host 기타 네 곳에서 나온 화살표가 하나
|
||||
|
||||
## Elements and evidence
|
||||
|
||||
- **VM1 QEMU** (service): 가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다. Evidence: L7029–L7029, L7041–L7044.
|
||||
- **VM2 QEMU** (service): 다른 가상 머신의 QEMU 프로세스. Evidence: L7031–L7031, L7046–L7048.
|
||||
- **Nginx** (service): 호스트에서 직접 도는 프로세스. Evidence: L7033–L7033.
|
||||
- **Host 기타** (service): 그 밖의 호스트 프로세스. Evidence: L7035–L7038.
|
||||
- **Host Block Layer** (service): 어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다. Evidence: L7031–L7031, L7017–L7022, L7054–L7054, L7058–L7060.
|
||||
- **NVMe** (device): 네 갈래가 결국 함께 쓰는 하나의 물리 device. Evidence: L7031–L7031, L7019–L7019, L7066–L7069.
|
||||
- **VM1 QEMU** (service): 가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다. Evidence: L7042–L7042, L7054–L7057.
|
||||
- **VM2 QEMU** (service): 다른 가상 머신의 QEMU 프로세스. Evidence: L7044–L7044, L7059–L7061.
|
||||
- **Nginx** (service): 호스트에서 직접 도는 프로세스. Evidence: L7046–L7046.
|
||||
- **Host 기타** (service): 그 밖의 호스트 프로세스. Evidence: L7048–L7051.
|
||||
- **Host Block Layer** (service): 어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다. Evidence: L7044–L7044, L7030–L7035, L7067–L7067, L7071–L7073.
|
||||
- **NVMe** (device): 네 갈래가 결국 함께 쓰는 하나의 물리 device. Evidence: L7044–L7044, L7032–L7032, L7079–L7082.
|
||||
|
||||
## Relationships
|
||||
|
||||
- **VM1 QEMU → Host Block Layer:** data. Evidence: L7029–L7031.
|
||||
- **VM2 QEMU → Host Block Layer:** data. Evidence: L7031–L7031.
|
||||
- **Nginx → Host Block Layer:** data. Evidence: L7031–L7033.
|
||||
- **Host 기타 → Host Block Layer:** data. Evidence: L7031–L7035.
|
||||
- **Host Block Layer → NVMe:** dispatch. Evidence: L7031–L7031, L7054–L7054.
|
||||
- **VM1 QEMU → Host Block Layer:** data. Evidence: L7042–L7044.
|
||||
- **VM2 QEMU → Host Block Layer:** data. Evidence: L7044–L7044.
|
||||
- **Nginx → Host Block Layer:** data. Evidence: L7044–L7046.
|
||||
- **Host 기타 → Host Block Layer:** data. Evidence: L7044–L7048.
|
||||
- **Host Block Layer → NVMe:** dispatch. Evidence: L7044–L7044, L7067–L7067.
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# 가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다
|
||||
# Question: 서로 다른 곳에서 시작한 I/O 는 어디에서 하나로 모여 device 로 나가는가
|
||||
direction: down
|
||||
direction: right
|
||||
n0: "VM1 QEMU" {
|
||||
shape: rectangle
|
||||
}
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
digraph techviz {
|
||||
graph [rankdir=LR, splines=ortho, nodesep=0.55, ranksep=0.85];
|
||||
node [fontname=Helvetica, fontsize=11, margin="0.18,0.12", style="rounded,filled", fillcolor=white, color="#2d4357", penwidth=1.5];
|
||||
edge [fontname=Helvetica, fontsize=10, color="#364b5f", penwidth=1.4, arrowsize=0.75];
|
||||
n0 [label="VM1 QEMU", shape=box, style="rounded,filled"];
|
||||
n1 [label="VM2 QEMU", shape=box, style="rounded,filled"];
|
||||
n2 [label="Nginx", shape=box, style="rounded,filled"];
|
||||
n3 [label="Host 기타", shape=box, style="rounded,filled"];
|
||||
n4 [label="Host Block Layer", shape=box, style="rounded,filled"];
|
||||
n5 [label="NVMe", shape=box, style="rounded,filled"];
|
||||
n0 -> n4 [label="", style=solid];
|
||||
n1 -> n4 [label="", style=solid];
|
||||
n2 -> n4 [label="", style=solid];
|
||||
n3 -> n4 [label="", style=solid];
|
||||
n4 -> n5 [label="dispatch", style=solid];
|
||||
}
|
||||
+17
-17
@@ -1,51 +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="vms-sharing-one-nvme" name="가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다">
|
||||
<mxGraphModel dx="895" dy="580" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="895" pageHeight="1169" math="0" shadow="0">
|
||||
<mxGraphModel dx="895" dy="642" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="895" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="n_vm1-qemu" value="VM1 QEMU<br/>WRITE X<br/>READ Y<br/>WRITE Z" tooltip="가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다. | Evidence: L7029-L7029, L7041-L7044" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
|
||||
<mxCell id="n_vm1-qemu" value="VM1 QEMU<br/>WRITE X<br/>READ Y<br/>WRITE Z" tooltip="가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다. | Evidence: L7042-L7042, L7054-L7057" 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="70.0" y="60.0" width="150.0" height="105.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_vm2-qemu" value="VM2 QEMU<br/>READ A<br/>WRITE B" tooltip="다른 가상 머신의 QEMU 프로세스. | Evidence: L7031-L7031, L7046-L7048" 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="280.0" y="68.5" width="150.0" height="88.0" as="geometry"/>
|
||||
<mxCell id="n_vm2-qemu" value="VM2 QEMU<br/>READ A<br/>WRITE B" tooltip="다른 가상 머신의 QEMU 프로세스. | Evidence: L7044-L7044, L7059-L7061" 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="70.0" y="237.0" width="150.0" height="88.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_nginx" value="Nginx" tooltip="호스트에서 직접 도는 프로세스. | Evidence: L7033-L7033" 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="490.0" y="80.5" width="150.0" height="64.0" as="geometry"/>
|
||||
<mxCell id="n_nginx" value="Nginx" tooltip="호스트에서 직접 도는 프로세스. | Evidence: L7046-L7046" 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="70.0" y="397.0" width="150.0" height="64.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_host-other" value="Host 기타" tooltip="그 밖의 호스트 프로세스. | Evidence: L7035-L7038" 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="700.0" y="80.5" width="150.0" height="64.0" as="geometry"/>
|
||||
<mxCell id="n_host-other" value="Host 기타" tooltip="그 밖의 호스트 프로세스. | Evidence: L7048-L7051" 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="70.0" y="533.0" width="150.0" height="64.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_host-block-layer" value="Host Block Layer<br/>Host block request<br/>blk-mq" tooltip="어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다. | Evidence: L7031-L7031, L7017-L7022, L7054-L7054, L7058-L7060" 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="380.0" y="261.0" width="160.0" height="88.0" as="geometry"/>
|
||||
<mxCell id="n_host-block-layer" value="Host Block Layer<br/>Host block request<br/>blk-mq" tooltip="어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다. | Evidence: L7044-L7044, L7030-L7035, L7067-L7067, L7071-L7073" 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="380.0" y="284.5" width="160.0" height="88.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="n_nvme" value="NVMe" tooltip="네 갈래가 결국 함께 쓰는 하나의 물리 device. | Evidence: L7031-L7031, L7019-L7019, L7066-L7069" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;shape=cylinder3;boundedLbl=1;backgroundOutline=1;fillColor=#eef6fb;" vertex="1" parent="1">
|
||||
<mxGeometry x="385.0" y="445.0" width="150.0" height="90.0" as="geometry"/>
|
||||
<mxCell id="n_nvme" value="NVMe" tooltip="네 갈래가 결국 함께 쓰는 하나의 물리 device. | Evidence: L7044-L7044, L7032-L7032, L7079-L7082" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;shape=cylinder3;boundedLbl=1;backgroundOutline=1;fillColor=#eef6fb;" vertex="1" parent="1">
|
||||
<mxGeometry x="700.0" y="296.5" width="150.0" height="64.0" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="e_vm1-to-block-layer" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_vm1-qemu" target="n_host-block-layer">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="289.0" y="185.0" as="offset"/>
|
||||
<mxPoint x="324.0" y="207.0" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="e_vm2-to-block-layer" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_vm2-qemu" target="n_host-block-layer">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="403.0" y="180.8" as="offset"/>
|
||||
<mxPoint x="324.0" y="300.2" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="e_nginx-to-block-layer" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_nginx" target="n_host-block-layer">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="517.0" y="174.8" as="offset"/>
|
||||
<mxPoint x="324.0" y="383.2" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="e_host-other-to-block-layer" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_host-other" target="n_host-block-layer">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="631.0" y="174.8" as="offset"/>
|
||||
<mxPoint x="324.0" y="460.2" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="e_block-layer-to-nvme" value="dispatch" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_host-block-layer" target="n_nvme">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="484.0" y="397.0" as="offset"/>
|
||||
<mxPoint x="620.0" y="300.5" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
|
||||
+82
-82
@@ -6,10 +6,10 @@
|
||||
{
|
||||
"id": "edge-vm1-to-block-layer",
|
||||
"type": "arrow",
|
||||
"x": 145.0,
|
||||
"y": 165.0,
|
||||
"width": 288.0,
|
||||
"height": 96.0,
|
||||
"x": 220.0,
|
||||
"y": 112.5,
|
||||
"width": 160.0,
|
||||
"height": 189.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
@@ -36,16 +36,16 @@
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
80.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
288.0,
|
||||
48.0
|
||||
80.0,
|
||||
189.0
|
||||
],
|
||||
[
|
||||
288.0,
|
||||
96.0
|
||||
160.0,
|
||||
189.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
@@ -66,10 +66,10 @@
|
||||
{
|
||||
"id": "edge-vm2-to-block-layer",
|
||||
"type": "arrow",
|
||||
"x": 355.0,
|
||||
"y": 156.5,
|
||||
"width": 96.0,
|
||||
"height": 104.5,
|
||||
"x": 220.0,
|
||||
"y": 281.0,
|
||||
"width": 160.0,
|
||||
"height": 38.5,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
@@ -96,16 +96,16 @@
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
52.25
|
||||
80.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
96.0,
|
||||
52.25
|
||||
80.0,
|
||||
38.5
|
||||
],
|
||||
[
|
||||
96.0,
|
||||
104.5
|
||||
160.0,
|
||||
38.5
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
@@ -126,10 +126,10 @@
|
||||
{
|
||||
"id": "edge-nginx-to-block-layer",
|
||||
"type": "arrow",
|
||||
"x": 469.0,
|
||||
"y": 144.5,
|
||||
"width": 96.0,
|
||||
"height": 116.5,
|
||||
"x": 220.0,
|
||||
"y": 337.5,
|
||||
"width": 160.0,
|
||||
"height": 91.5,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
@@ -152,20 +152,20 @@
|
||||
"locked": false,
|
||||
"points": [
|
||||
[
|
||||
96.0,
|
||||
0.0,
|
||||
91.5
|
||||
],
|
||||
[
|
||||
80.0,
|
||||
91.5
|
||||
],
|
||||
[
|
||||
80.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
96.0,
|
||||
58.25
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
58.25
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
116.5
|
||||
160.0,
|
||||
0.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
@@ -186,10 +186,10 @@
|
||||
{
|
||||
"id": "edge-host-other-to-block-layer",
|
||||
"type": "arrow",
|
||||
"x": 487.0,
|
||||
"y": 144.5,
|
||||
"width": 288.0,
|
||||
"height": 116.5,
|
||||
"x": 220.0,
|
||||
"y": 355.5,
|
||||
"width": 160.0,
|
||||
"height": 209.5,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
@@ -212,20 +212,20 @@
|
||||
"locked": false,
|
||||
"points": [
|
||||
[
|
||||
288.0,
|
||||
0.0,
|
||||
209.5
|
||||
],
|
||||
[
|
||||
80.0,
|
||||
209.5
|
||||
],
|
||||
[
|
||||
80.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
288.0,
|
||||
58.25
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
58.25
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
116.5
|
||||
160.0,
|
||||
0.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
@@ -246,10 +246,10 @@
|
||||
{
|
||||
"id": "edge-block-layer-to-nvme",
|
||||
"type": "arrow",
|
||||
"x": 460.0,
|
||||
"y": 349.0,
|
||||
"width": 0.0,
|
||||
"height": 96.0,
|
||||
"x": 540.0,
|
||||
"y": 328.5,
|
||||
"width": 160.0,
|
||||
"height": 0.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
@@ -276,16 +276,16 @@
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
80.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
48.0
|
||||
80.0,
|
||||
0.0
|
||||
],
|
||||
[
|
||||
0.0,
|
||||
96.0
|
||||
160.0,
|
||||
0.0
|
||||
]
|
||||
],
|
||||
"lastCommittedPoint": null,
|
||||
@@ -306,8 +306,8 @@
|
||||
{
|
||||
"id": "edge-label-block-layer-to-nvme",
|
||||
"type": "text",
|
||||
"x": 439.0,
|
||||
"y": 385.0,
|
||||
"x": 575.0,
|
||||
"y": 288.5,
|
||||
"width": 90,
|
||||
"height": 24,
|
||||
"angle": 0,
|
||||
@@ -414,8 +414,8 @@
|
||||
{
|
||||
"id": "node-vm2-qemu",
|
||||
"type": "rectangle",
|
||||
"x": 280.0,
|
||||
"y": 68.5,
|
||||
"x": 70.0,
|
||||
"y": 237.0,
|
||||
"width": 150.0,
|
||||
"height": 88.0,
|
||||
"angle": 0,
|
||||
@@ -444,8 +444,8 @@
|
||||
{
|
||||
"id": "node-label-vm2-qemu",
|
||||
"type": "text",
|
||||
"x": 290.0,
|
||||
"y": 78.5,
|
||||
"x": 80.0,
|
||||
"y": 247.0,
|
||||
"width": 130.0,
|
||||
"height": 68.0,
|
||||
"angle": 0,
|
||||
@@ -483,8 +483,8 @@
|
||||
{
|
||||
"id": "node-nginx",
|
||||
"type": "rectangle",
|
||||
"x": 490.0,
|
||||
"y": 80.5,
|
||||
"x": 70.0,
|
||||
"y": 397.0,
|
||||
"width": 150.0,
|
||||
"height": 64.0,
|
||||
"angle": 0,
|
||||
@@ -513,8 +513,8 @@
|
||||
{
|
||||
"id": "node-label-nginx",
|
||||
"type": "text",
|
||||
"x": 500.0,
|
||||
"y": 90.5,
|
||||
"x": 80.0,
|
||||
"y": 407.0,
|
||||
"width": 130.0,
|
||||
"height": 44.0,
|
||||
"angle": 0,
|
||||
@@ -552,8 +552,8 @@
|
||||
{
|
||||
"id": "node-host-other",
|
||||
"type": "rectangle",
|
||||
"x": 700.0,
|
||||
"y": 80.5,
|
||||
"x": 70.0,
|
||||
"y": 533.0,
|
||||
"width": 150.0,
|
||||
"height": 64.0,
|
||||
"angle": 0,
|
||||
@@ -582,8 +582,8 @@
|
||||
{
|
||||
"id": "node-label-host-other",
|
||||
"type": "text",
|
||||
"x": 710.0,
|
||||
"y": 90.5,
|
||||
"x": 80.0,
|
||||
"y": 543.0,
|
||||
"width": 130.0,
|
||||
"height": 44.0,
|
||||
"angle": 0,
|
||||
@@ -622,7 +622,7 @@
|
||||
"id": "node-host-block-layer",
|
||||
"type": "rectangle",
|
||||
"x": 380.0,
|
||||
"y": 261.0,
|
||||
"y": 284.5,
|
||||
"width": 160.0,
|
||||
"height": 88.0,
|
||||
"angle": 0,
|
||||
@@ -652,7 +652,7 @@
|
||||
"id": "node-label-host-block-layer",
|
||||
"type": "text",
|
||||
"x": 390.0,
|
||||
"y": 271.0,
|
||||
"y": 294.5,
|
||||
"width": 140.0,
|
||||
"height": 68.0,
|
||||
"angle": 0,
|
||||
@@ -690,10 +690,10 @@
|
||||
{
|
||||
"id": "node-nvme",
|
||||
"type": "rectangle",
|
||||
"x": 385.0,
|
||||
"y": 445.0,
|
||||
"x": 700.0,
|
||||
"y": 296.5,
|
||||
"width": 150.0,
|
||||
"height": 90.0,
|
||||
"height": 64.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "#ffffff",
|
||||
@@ -720,10 +720,10 @@
|
||||
{
|
||||
"id": "node-label-nvme",
|
||||
"type": "text",
|
||||
"x": 395.0,
|
||||
"y": 455.0,
|
||||
"x": 710.0,
|
||||
"y": 306.5,
|
||||
"width": 130.0,
|
||||
"height": 70.0,
|
||||
"height": 44.0,
|
||||
"angle": 0,
|
||||
"strokeColor": "#1e1e1e",
|
||||
"backgroundColor": "transparent",
|
||||
|
||||
+17
-6
@@ -2,30 +2,41 @@
|
||||
"harness_version": "0.2.0",
|
||||
"spec_id": "vms-sharing-one-nvme",
|
||||
"spec_version": "1.1",
|
||||
"spec_sha256": "43a75d5863edb3e1585ebf97e76f7bd9bf773c90836d4f8f91936eb8a557bd28",
|
||||
"spec_sha256": "6812a95ed58705ecd051637940be6fa063ab59e3e383ab7178eb02f65911df2b",
|
||||
"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
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
"vms-sharing-one-nvme.svg",
|
||||
"vms-sharing-one-nvme.drawio",
|
||||
"vms-sharing-one-nvme.mmd",
|
||||
"vms-sharing-one-nvme.d2",
|
||||
"vms-sharing-one-nvme.dot",
|
||||
"vms-sharing-one-nvme.drawio",
|
||||
"vms-sharing-one-nvme.excalidraw",
|
||||
"vms-sharing-one-nvme.alt.md"
|
||||
],
|
||||
"lint_issue_count": 5,
|
||||
"lint_issue_count": 6,
|
||||
"assumption_count": 0,
|
||||
"assumptions_allowed": false,
|
||||
"composition_profile": "component-flow",
|
||||
"reference_ids": [
|
||||
"payment-event-flow"
|
||||
],
|
||||
"diagram_only": true
|
||||
"diagram_only": true,
|
||||
"source_spec_file_sha256": "097931ac2fcf015484bea63eb103ff71903eebf82ab1f0e75dbfcdf03e5f3b6c",
|
||||
"output_sha256": {
|
||||
"vms-sharing-one-nvme.svg": "e9e9d9d5ae1b52963b7c1f2da7ec26469e9aa2151359dbd155c7723f3d3e6f7e",
|
||||
"vms-sharing-one-nvme.mmd": "4a5feab7ba90b3abe5b789ae8b2e94a40bdc93550e3bdb8688aff6b25f4f129d",
|
||||
"vms-sharing-one-nvme.d2": "a60e12df711a410c4396d9b83910da472c74f96fc95f7f89e2ccbfbb6cc7a206",
|
||||
"vms-sharing-one-nvme.dot": "9e731563bc8008ab4429da8d153f42d1da54ed8f04a87fae3c0dd4794e9ef1ea",
|
||||
"vms-sharing-one-nvme.drawio": "51d7776fb874bcb205782d46167aef73698c59a12c6f578f6154e9112b27517c",
|
||||
"vms-sharing-one-nvme.excalidraw": "c6200d7585ab24fecaf0ed04dca372e93467b1383dbaec03f8c053d520f8d83a",
|
||||
"vms-sharing-one-nvme.alt.md": "e002e3dae78d86266d8ef4c9f572ba225386643c74221fb1cc0665267a9e374e"
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%% 가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다
|
||||
%% question: 서로 다른 곳에서 시작한 I/O 는 어디에서 하나로 모여 device 로 나가는가
|
||||
flowchart TB
|
||||
flowchart LR
|
||||
n0["VM1 QEMU"]
|
||||
n1["VM2 QEMU"]
|
||||
n2["Nginx"]
|
||||
|
||||
+27
-27
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="895" height="580" viewBox="0 0 895 580" role="img" aria-labelledby="diagram-title diagram-description">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="895" height="642" viewBox="0 0 895 642" role="img" aria-labelledby="diagram-title diagram-description">
|
||||
<title id="diagram-title">가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다</title>
|
||||
<desc id="diagram-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 과는 다투는 자원이 다르다는 것은 본문 문단이 맡는다.</desc>
|
||||
<metadata>{"techviz":{"spec_version":"1.1","id":"vms-sharing-one-nvme","profile":"component-flow"},"source_context":{"document":"docs/virtualization/final/document.md","document_sha256":"181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd","anchor":{"kind":"heading","value":"159. 여러 VM이 하나의 NVMe를 공유하면","line":7026}},"evidence_policy":"Each factual element cites source lines or is marked assumption.","diagram_only":true}</metadata>
|
||||
<metadata>{"techviz":{"spec_version":"1.1","id":"vms-sharing-one-nvme","profile":"component-flow"},"source_context":{"document":"docs/virtualization/final/document.md","document_sha256":"8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210","anchor":{"kind":"heading","value":"159. 여러 VM이 하나의 NVMe를 공유하면","line":7039}},"evidence_policy":"Each factual element cites source lines or is marked assumption.","diagram_only":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" />
|
||||
@@ -49,16 +49,16 @@
|
||||
.timeline-detail { font-size: 11px; fill: #4b5563; text-anchor: middle; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect class="canvas" width="895" height="580" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="145.0,165.0 145.0,213.0 433.0,213.0 433.0,261.0" data-evidence="7029-7031" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="355.0,156.5 355.0,208.8 451.0,208.8 451.0,261.0" data-evidence="7031-7031" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="565.0,144.5 565.0,202.8 469.0,202.8 469.0,261.0" data-evidence="7031-7033" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="775.0,144.5 775.0,202.8 487.0,202.8 487.0,261.0" data-evidence="7031-7035" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="460.0,349.0 460.0,397.0 460.0,397.0 460.0,445.0" data-evidence="7031-7031,7054-7054" />
|
||||
<rect class="edge-label-bg" x="448.2" y="383.0" width="71.6" height="22" rx="3" />
|
||||
<text class="edge-label" x="484.0" y="398.0">dispatch</text>
|
||||
<rect class="canvas" width="895" height="642" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,112.5 300.0,112.5 300.0,301.5 380.0,301.5" data-evidence="7042-7044" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,281.0 300.0,281.0 300.0,319.5 380.0,319.5" data-evidence="7044-7044" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,429.0 300.0,429.0 300.0,337.5 380.0,337.5" data-evidence="7044-7046" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="220.0,565.0 300.0,565.0 300.0,355.5 380.0,355.5" data-evidence="7044-7048" />
|
||||
<polyline class="edge kind-data style-solid emphasis-normal" points="540.0,328.5 620.0,328.5 620.0,328.5 700.0,328.5" data-evidence="7044-7044,7067-7067" />
|
||||
<rect class="edge-label-bg" x="584.2" y="286.5" width="71.6" height="22" rx="3" />
|
||||
<text class="edge-label" x="620.0" y="301.5">dispatch</text>
|
||||
<g id="node-vm1-qemu">
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7029-7029,7041-7044" x="70.0" y="60.0" width="150.0" height="105.0" rx="7" />
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7042-7042,7054-7057" x="70.0" y="60.0" width="150.0" height="105.0" rx="7" />
|
||||
<text class="node-label" x="145.0" y="87.0">VM1 QEMU</text>
|
||||
<line class="node-detail-divider" x1="84.0" y1="108.0" x2="206.0" y2="108.0" />
|
||||
<text class="node-detail" x="86.0" y="125.0">WRITE X</text>
|
||||
@@ -66,29 +66,29 @@
|
||||
<text class="node-detail" x="86.0" y="157.0">WRITE Z</text>
|
||||
</g>
|
||||
<g id="node-vm2-qemu">
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7031-7031,7046-7048" x="280.0" y="68.5" width="150.0" height="88.0" rx="7" />
|
||||
<text class="node-label" x="355.0" y="95.5">VM2 QEMU</text>
|
||||
<line class="node-detail-divider" x1="294.0" y1="116.5" x2="416.0" y2="116.5" />
|
||||
<text class="node-detail" x="296.0" y="133.5">READ A</text>
|
||||
<text class="node-detail" x="296.0" y="149.5">WRITE B</text>
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7044-7044,7059-7061" x="70.0" y="237.0" width="150.0" height="88.0" rx="7" />
|
||||
<text class="node-label" x="145.0" y="264.0">VM2 QEMU</text>
|
||||
<line class="node-detail-divider" x1="84.0" y1="285.0" x2="206.0" y2="285.0" />
|
||||
<text class="node-detail" x="86.0" y="302.0">READ A</text>
|
||||
<text class="node-detail" x="86.0" y="318.0">WRITE B</text>
|
||||
</g>
|
||||
<g id="node-nginx">
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7033-7033" x="490.0" y="80.5" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="565.0" y="110.5">Nginx</text>
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7046-7046" x="70.0" y="397.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="145.0" y="427.0">Nginx</text>
|
||||
</g>
|
||||
<g id="node-host-other">
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7035-7038" x="700.0" y="80.5" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="775.0" y="110.5">Host 기타</text>
|
||||
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="7048-7051" x="70.0" y="533.0" width="150.0" height="64.0" rx="7" />
|
||||
<text class="node-label" x="145.0" y="563.0">Host 기타</text>
|
||||
</g>
|
||||
<g id="node-host-block-layer">
|
||||
<rect class="node-shape kind-service emphasis-primary role-queue" data-evidence="7031-7031,7017-7022,7054-7054,7058-7060" x="380.0" y="261.0" width="160.0" height="88.0" rx="7" />
|
||||
<text class="node-label" x="460.0" y="288.0">Host Block Layer</text>
|
||||
<line class="node-detail-divider" x1="394.0" y1="309.0" x2="526.0" y2="309.0" />
|
||||
<text class="node-detail" x="396.0" y="326.0">Host block request</text>
|
||||
<text class="node-detail" x="396.0" y="342.0">blk-mq</text>
|
||||
<rect class="node-shape kind-service emphasis-primary role-queue" data-evidence="7044-7044,7030-7035,7067-7067,7071-7073" x="380.0" y="284.5" width="160.0" height="88.0" rx="7" />
|
||||
<text class="node-label" x="460.0" y="311.5">Host Block Layer</text>
|
||||
<line class="node-detail-divider" x1="394.0" y1="332.5" x2="526.0" y2="332.5" />
|
||||
<text class="node-detail" x="396.0" y="349.5">Host block request</text>
|
||||
<text class="node-detail" x="396.0" y="365.5">blk-mq</text>
|
||||
</g>
|
||||
<g id="node-nvme">
|
||||
<rect class="node-shape kind-device emphasis-normal role-sink" data-evidence="7031-7031,7019-7019,7066-7069" x="385.0" y="458.0" width="150.0" height="64.0" /><ellipse class="node-shape kind-device emphasis-normal role-sink" cx="460.0" cy="458.0" rx="75.0" ry="13.0" /><path class="storage-bottom" d="M 385.0 522.0 A 75.0 13.0 0 0 0 535.0 522.0" />
|
||||
<text class="node-label" x="460.0" y="488.0">NVMe</text>
|
||||
<rect class="node-shape kind-device emphasis-normal role-sink" data-evidence="7044-7044,7032-7032,7079-7082" x="700.0" y="307.2" width="150.0" height="42.7" /><ellipse class="node-shape kind-device emphasis-normal role-sink" cx="775.0" cy="307.2" rx="75.0" ry="10.7" /><path class="storage-bottom" d="M 700.0 349.8 A 75.0 10.7 0 0 0 850.0 349.8" />
|
||||
<text class="node-label" x="775.0" y="326.5">NVMe</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
Reference in New Issue
Block a user