成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

K8s 里如何優雅地使用 /dev/shm 實現容器間共享內存

系統 Linux
Linux 里有一個 /dev/shm? 目錄,shm 代表共享內存(Shared Memory)。如果這是你第一次聽說 shm,可能會有點疑惑:“這東西到底是內存還是磁盤”。

本文經胡說云原生授權轉載。

1. 從 docker run 的 --shm-size 參數聊起

今天無意見看到算法同學寫的一個 docker run 命令用到了 --shm-size 參數。沒錯,接著他想將這些容器跑到 K8s 里,于是我就得開始思考 --shm-size 在 K8s 里對應的特性是什么了。

我猜 K8s 里會有優雅的方式來實現一樣的目的,最終我也找到了那個優雅的方法。不過這個過程還是稍稍坎坷,我在在網上看一圈,找到的前2種方案都有點“丑陋”,但是給人一種“只能這樣”的錯覺。最后看到第三條路的時候,我不禁拍了一下大腿:“我X!太帥了!”。于是乎,我想讓你們也拍一下大腿,然后就有了此文。行,且往下看。

2. Linux 里的 /dev/shm

Linux 里有一個 /dev/shm 目錄,shm 代表共享內存(Shared Memory)。如果這是你第一次聽說 shm,可能會有點疑惑:“這東西到底是內存還是磁盤”。其實 /dev/shm 是一個臨時文件系統,讓你用操作磁盤中的文件一樣的方式來將讀寫內存。換言之,你可以用文件讀寫的語法來操作“/dev/shm/a.txt”,但是這個文件本質是存在內存里的,所以讀寫速度會非常快。

有了 /dev/shm,你就可以讓一個進程非常高效地存取一些臨時文件,或者讓多個進程非常高效的“共享內存”。這種“進程間快速共享內存”的能力對于很多機器學習框架來說非常有用。

順口提一下,可能大伙平時接觸最多的進程間通信(IPC)方式是 Socket 和 RPC,這類走網絡通信的方式可以實現跨主機的 IPC,應用場景更廣。不過上帝給你開了一扇門,就不會多給你開一堆窗,Socket 和 RPC 的通信效率肯定就沒有“共享內存”來得快了。(可能你心里在想 http 協議,沒錯,http 用的更多,但是一般 http 不被歸入進程間通信方式。)

3. Docker 對共享內存的支持

在 Linux 系統中,/dev/shm 的大小一般為物理內存的一半。Docker 在啟動容器的時候,默認給容器設置的 /dev/shm 大小是 64M。(你品,你細品,是不是自定義容器內 shm 大小的需求就產生了?)

Docker 在 shm 大小的配置上提供了兩種支持:

  1. docker run 支持通過 --shm-size=1g 這種方式指定一個容器的 shm 大小;
  2. Docker 配置 daemon.json 中可以通過 "shared-memory-size": "1G" 配置指定容器啟動的默認 shm 大小。

不難猜到,--shm-size 參數的優先級會比 shared-memory-size 配置高。

4. K8s 里如何設置 /dev/shm 大小

K8s 里沒有原生提供啥直觀的 shm 配置方式。但是為了讓應用能夠嘗到“共享內存”的滋味,YAML 工程師還是得給出方案。

4.1 方案一:修改節點的 Docker 配置

Sao 操作來了,因為 Docker 支持 shared-memory-size 配置,所以直接修改節點的 daemon.json 配置,那不就讓所有 Pod 都能夠用起來更大的 share memory 了?

我就不演示了。反正基本滿足需求,但是冥冥之中又讓你覺得哪里不太對勁,總之吧,不優雅。

4.2 方案二:通過 Volume 掛載一個大目錄到 Pod 的 /dev/shm

不就是讓 Pod 內的 /dev/shm 大一點嘛,那就掛卷呀:

apiVersion:v1
kind:Pod
metadata:
  name:shared-memory-pod
spec:
  containers:
    -name:mycontainer
      image:your_image_name
      volumeMounts:
        -name:shared-memory-volume
          mountPath:/dev/shm
  volumes:
    -name:shared-memory-volume
      emptyDir:{}

如果用 PVC 的方式,后端存儲系統支持限定卷大小的話,這里就能精準分配 shm 的大小了。總之,業務能跑起來。(你是不是已經忍不住要開噴了?忍忍。我知道,這種方式通過磁盤上的文件來實現“共享內存”,功能走通了,性能不達標。)

到這一步,我以為“方案一”挺合理的,改改 Docker 的啟動參數,似乎影響不大,沒啥大壞處,妥。

不過更進一步,K8s 真的不支持配置 shm?這個需求聽起來合理呀,為什么沒有被實現呢?繼續搜一搜,我在 stackoverflow 上看到了第三種玩法。

4.3 方案三:用 K8s 的方式共享內存

且看這段配置:

apiVersion:v1
kind:Pod
metadata:
  name:shared-memory-pod
spec:
  volumes:
    -name:dshm
      emptyDir:
        medium:Memory
        sizeLimit:"1Gi"
  containers:
    -name:mycontainer
      image:your_image_name
      volumeMounts:
        -name:dshm
          mountPath:/dev/shm

行吧,破案了。之前我也不知道 emptyDir 可以配置 medium: Memory。

5. 總結

散了吧,總結啥。大周五的,早點回家。

責任編輯:武曉燕 來源: 胡說云原生
相關推薦

2024-12-06 08:00:00

K8s

2025-04-01 00:06:50

JavaK8sSpring

2023-07-04 07:30:03

容器Pod組件

2023-10-07 15:46:29

K8sKubernetes部署

2022-04-29 10:40:38

技術服務端K8s

2018-01-12 14:35:00

Linux進程共享內存

2022-04-22 13:32:01

K8s容器引擎架構

2021-01-28 14:53:19

PHP編碼開發

2022-01-02 08:42:50

架構部署容器

2021-05-12 22:07:43

并發編排任務

2020-12-08 08:08:51

Java接口數據

2022-06-01 09:38:36

KubernetesPod容器

2022-06-14 07:56:15

Kubernetes存儲架構K8S

2018-08-20 10:40:09

Redis位圖操作

2023-11-06 07:16:22

WasmK8s模塊

2023-09-06 08:12:04

k8s云原生

2021-03-24 10:20:50

Fonts前端代碼

2023-11-19 22:31:00

內存程序

2021-03-24 06:26:00

kubeadmK8Scontainerd

2022-08-29 10:08:50

跨集群
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久黄网 | 狠狠亚洲 | 亚洲伊人久久综合 | 日韩一区二区三区精品 | www一级片| 久久久久久久一区二区 | 成人欧美日韩一区二区三区 | 九色av| 久久免费精品 | 国产无人区一区二区三区 | 中文字幕av亚洲精品一部二部 | 国产精品国产三级国产aⅴ中文 | 日韩在线一区二区 | 欧美一区二区免费视频 | 一区二区三区四区电影 | 日本不卡一区二区三区 | av网站在线看 | 国产精品一区二区三区免费观看 | 国产精品久久视频 | 亚洲高清在线 | 日韩欧美国产不卡 | 久久久久99 | 免费毛片网站在线观看 | 国产在线小视频 | 免费看一级毛片 | 久久九九色 | 亚洲在线一区 | 中文字幕在线观看一区二区 | 精品乱码久久久久 | 日韩在线播放一区 | 精品在线一区二区 | 五月婷婷色 | 99亚洲| 最新超碰 | 色网在线看 | 天天草草草 | 久久久久久久久久久一区二区 | 九九九精品视频 | 国产精品久久久久无码av | 免费看a | 欧美成人在线影院 |