Skip to main content

ubuntu:v1

  1. ubuntu:v1
    +
    python:v3
    +
    repo-B:v5
    +
    harness:v42
    


    ---

    # 为什么这个设计非常牛?

    假设:

    
    N = 100,000 repositories
    K = 20 toolkit versions
    


    如果 monolithic image:

    
    100,000 × 20
    


    大量重复构建。

    而 composable layer:

    
    100,000 repo layers
    +
    20 toolkit layers
    


    更新 toolkit:

    
    只更新 toolkit layer
    


    论文把这个复杂度从:

    
    O(k × N)
    


    降到:

    
    O(k)
    


    这一点是 DSec 很漂亮的系统设计。([arXiv][1])

    ---

    # 第六课:为什么是 EROFS?

    这里千万不要简单理解成:

    > “EROFS 比 ext4 快。”

    不是。

    真正原因是:

    > DSEC 需要一个 immutable + compressed + random-access + lazy-load 的 image representation。

    传统:

    
    tar.gz
    


    是:

    
    archive
     ↓
    download
     ↓
    decompress
     ↓
    write everything
     ↓
    start
    


    假设:

    
    image = 6GB
    agent actually needs = 300MB
    


    你还是得:

    
    6GB
    ↓↓↓↓↓↓
    download
    ↓↓↓↓↓↓
    unpack
    ↓↓↓↓↓↓
    write
    


    ---

    # EROFS 的模式

    变成:

    
              EROFS
            /       \
     metadata       data
        │             │
     local           3FS
                       │
                 on-demand
    


    启动:

    
    mount metadata
          ↓
    sandbox ready
          ↓
    Agent accesses /usr/bin/python
          ↓
    page fault
          ↓
    fetch required data from 3FS
          ↓
    continue
    


    也就是说:

    > 不是“把 image 搬到机器上再运行”,而是“让 image 像一个远程只读文件系统一样存在”。

    这是理解 DSec 的关键。

    论文明确利用 EROFS 将 metadata 与 data 分离,并把 metadata 放在本地,而 data 从 3FS 按需读取。([arXiv][1])

    ---

    # 于是 3FS 在这里扮演什么?

    注意:

    3FS 不是 Docker Registry。

    它更像:

    
                        3FS
                         │
            ┌────────────┼────────────┐
            │            │            │
          Image        Workspace    Snapshot
            │
            ▼
         EROFS
            │
        on-demand
    


    为什么?

    因为 3FS 擅长:

    
    large sequential IO
    


    不擅长:

    
    small random IO
    


    所以 DSec 的设计是:

    ### Read

    
    3FS
     ↓
    bulk on-demand read
    


    ### Write

    
    local disk
    


    而不是:

    
    sandbox writes → 3FS
    


    因为 Agent 会疯狂产生:

    
    small file
    log
    temporary file
    package cache
    ...
    


    这种小随机写会把 3FS 弄得很难受。

    ([arXiv][1])

    ---

    # 这是 DSec 一个非常漂亮的“IO 分工”

    
                      Storage
    
                   ┌───────────┐
                   │    3FS    │
                   └─────┬─────┘
                         │
                  large sequential
                         │
                         ▼
                   READ IMAGE
                         │
                         │
                         ▼
                      Sandbox
                         │
                    WRITE STATE
                         │
                         ▼
                   local disk
    


    Remote read + local write。

    这不是偶然。

    这是根据 3FS 的 I/O 性质反推出来的架构。

    ---

    # 第七课:Container 和 MicroVM 的存储设计为什么又不一样?

    这里开始进入“真正系统工程”的层面。

    ---

    ## Container

    
    EROFS
    EROFS
    EROFS
      ↓
    OverlayFS
      ↓
    upperdir
      ↓
    local disk
    


    例如:

    
    Base
     ↓
    Workspace
     ↓
    Toolkit
     ↓
    Writable
    


    ---

    ## MicroVM

    Firecracker 不能直接照搬这个设计。

    所以:

    
    EROFS
       ↓
    read-only layers
    
    OverlayBD
       ↓
    writable ext4 disk
    


    再通过:

    
    ublk
    


    暴露给 guest。

    所以:

    
    Host
     │
     │ 3FS
     ▼
    OverlayBD
     │
     ▼
    ublk
     │
     ▼
    MicroVM
     │
     ▼
    ext4
    


    论文特别提到,OverlayBD 可以支持:

    
    on-demand read
    local write
    incremental snapshot
    


    并且使用 256 KiB chunks + local second-level cache 来缓解小随机读取问题。([arXiv][1])

    ---

    # 第八课:为什么 DSec 能塞下这么多 Sandbox?

    现在进入另一个核心:

    # Memory Overcommit

    假设一台机器:

    
    RAM = 1 TB
    


    如果:

    
    sandbox = 4 GB
    


    传统:

    
    1000 / 4GB = 250
    


    但是 Agent Sandbox:

    
    CPU usage 很低
    


    所以 CPU 可以 overcommit。

    但 memory 不行。

    因为:

    
    sandbox memory
    guest page cache
    host page cache
    anonymous memory
    


    都可能占住。

    ---

    # MicroVM 的一个巨大浪费

    假设:

    
    Image data
    


    被 guest 读取。

    可能:

    
    Host page cache
           +
    Guest page cache
    


    出现:

    
    同一份数据
           ↓
    两份 cache
    


    这非常浪费。

    ---

    # DSec 的解决方案之一:virtio-pmem + DAX

    核心思想:

    
            3FS / backing data
                    │
                    ▼
            Host-backed pages
                    │
              ┌─────┴─────┐
              ▼           ▼
            VM1           VM2
    


    而不是:

    
    Host cache
       ↓ copy
    Guest cache 1
    
    Host cache
       ↓ copy
    Guest cache 2
    


    这样可以让多个 microVM 共享 host page cache。

    实验中:

    > virtio-pmem + DAX 将 peak host memory usage 降低 **40.2%**。