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
@@ -10,17 +10,17 @@ VM1 QEMU, VM2 QEMU, Nginx, Host 기타 네 곳에서 나온 화살표가 하나
## Elements and evidence
- **VM1 QEMU** (service): 가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다. Evidence: L7029L7029, L7041L7044.
- **VM2 QEMU** (service): 다른 가상 머신의 QEMU 프로세스. Evidence: L7031L7031, L7046L7048.
- **Nginx** (service): 호스트에서 직접 도는 프로세스. Evidence: L7033L7033.
- **Host 기타** (service): 그 밖의 호스트 프로세스. Evidence: L7035L7038.
- **Host Block Layer** (service): 어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다. Evidence: L7031L7031, L7017L7022, L7054L7054, L7058L7060.
- **NVMe** (device): 네 갈래가 결국 함께 쓰는 하나의 물리 device. Evidence: L7031L7031, L7019L7019, L7066L7069.
- **VM1 QEMU** (service): 가상 머신 하나의 QEMU 프로세스. 게스트의 I/O 가 여기서 호스트 파일 I/O 가 된다. Evidence: L7042L7042, L7054L7057.
- **VM2 QEMU** (service): 다른 가상 머신의 QEMU 프로세스. Evidence: L7044L7044, L7059L7061.
- **Nginx** (service): 호스트에서 직접 도는 프로세스. Evidence: L7046L7046.
- **Host 기타** (service): 그 밖의 호스트 프로세스. Evidence: L7048L7051.
- **Host Block Layer** (service): 어디서 왔는지 구분하지 않고 모두 Host block request 로 다루는 계층. queue 에서 관리해 device 로 내보낸다. Evidence: L7044L7044, L7030L7035, L7067L7067, L7071L7073.
- **NVMe** (device): 네 갈래가 결국 함께 쓰는 하나의 물리 device. Evidence: L7044L7044, L7032L7032, L7079L7082.
## Relationships
- **VM1 QEMU → Host Block Layer:** data. Evidence: L7029L7031.
- **VM2 QEMU → Host Block Layer:** data. Evidence: L7031L7031.
- **Nginx → Host Block Layer:** data. Evidence: L7031L7033.
- **Host 기타 → Host Block Layer:** data. Evidence: L7031L7035.
- **Host Block Layer → NVMe:** dispatch. Evidence: L7031L7031, L7054L7054.
- **VM1 QEMU → Host Block Layer:** data. Evidence: L7042L7044.
- **VM2 QEMU → Host Block Layer:** data. Evidence: L7044L7044.
- **Nginx → Host Block Layer:** data. Evidence: L7044L7046.
- **Host 기타 → Host Block Layer:** data. Evidence: L7044L7048.
- **Host Block Layer → NVMe:** dispatch. Evidence: L7044L7044, L7067L7067.
@@ -1,6 +1,6 @@
# 가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다
# Question: 서로 다른 곳에서 시작한 I/O 는 어디에서 하나로 모여 device 로 나가는가
direction: down
direction: right
n0: "VM1 QEMU" {
shape: rectangle
}
@@ -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];
}
@@ -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&lt;br/&gt;WRITE X&lt;br/&gt;READ Y&lt;br/&gt;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&lt;br/&gt;WRITE X&lt;br/&gt;READ Y&lt;br/&gt;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&lt;br/&gt;READ A&lt;br/&gt;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&lt;br/&gt;READ A&lt;br/&gt;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&lt;br/&gt;Host block request&lt;br/&gt;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&lt;br/&gt;Host block request&lt;br/&gt;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>
@@ -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",
@@ -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,6 +1,6 @@
%% 가상 머신 둘과 호스트 프로세스가 하나의 NVMe 로 모인다
%% question: 서로 다른 곳에서 시작한 I/O 는 어디에서 하나로 모여 device 로 나가는가
flowchart TB
flowchart LR
n0["VM1 QEMU"]
n1["VM2 QEMU"]
n2["Nginx"]
@@ -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>{&quot;techviz&quot;:{&quot;spec_version&quot;:&quot;1.1&quot;,&quot;id&quot;:&quot;vms-sharing-one-nvme&quot;,&quot;profile&quot;:&quot;component-flow&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;159. 여러 VM이 하나의 NVMe를 공유하면&quot;,&quot;line&quot;:7026}},&quot;evidence_policy&quot;:&quot;Each factual element cites source lines or is marked assumption.&quot;,&quot;diagram_only&quot;:true}</metadata>
<metadata>{&quot;techviz&quot;:{&quot;spec_version&quot;:&quot;1.1&quot;,&quot;id&quot;:&quot;vms-sharing-one-nvme&quot;,&quot;profile&quot;:&quot;component-flow&quot;},&quot;source_context&quot;:{&quot;document&quot;:&quot;docs/virtualization/final/document.md&quot;,&quot;document_sha256&quot;:&quot;8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210&quot;,&quot;anchor&quot;:{&quot;kind&quot;:&quot;heading&quot;,&quot;value&quot;:&quot;159. 여러 VM이 하나의 NVMe를 공유하면&quot;,&quot;line&quot;:7039}},&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" />
@@ -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