当前位置: 首页 > news >正文

【博客472】k8s中如何使用shared memory

k8s中如何使用shared memory

场景:

需要在训练任务的pod内有两个服务,他们之间通过共享内存方式来交换数据,以获取更高的效率

问题:

注意:/dev/shm即为共享内存的大小

在kvm或者物理机器上,用户可以使用的共享内存为:

root@pve:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                  48G   154M   24G  1% /dev/shm
...
...

但在kubernetes上,Pod里无法使用超过 64MB的shared memory。如下是集群上一个pod的信息,可以看到,/dev/shm的大小是 64MB,通过dd往共享内存写数据时,写到64MB的时候就会报“No space left on device”。

$ kubectl run centos --rm -it --image centos:7 bash
[root@centos-7df8445565-dvpnt /]# df -h|grep shm
Filesystem      Size  Used Avail Use% Mounted on
shm              64M     0   64M   0% /dev/shm
[root@centos-7df8445565-dvpnt /]# dd if=/dev/zero of=/dev/shm/test      bs=1024 count=102400
dd: error writing '/dev/shm/test': No space left on device
65537+0 records in
65536+0 records out
67108864 bytes (67 MB) copied, 0.161447 s, 416 MB/s
[root@centos-7df8445565-dvpnt /]# ls -l -h
total 64M
-rw-r--r-- 1 root root 64M Nov 14 14:33 test
[root@centos-7df8445565-dvpnt /]# df -h|grep shm
Filesystem      Size  Used Avail Use% Mounted on
shm              64M   64M     0 100% /dev/shm

为什么是64M

kubernetes创建的Pod,其共享内存默认64MB,且不可更改。
因为kubernetes本身是没有设置share memory的大小的,64MB其实是docker 默认的共享内存的大小。

docker环境下如何支持更大的shared memory

docker run 的时候,可以通过–shm-size来设置共享内存的大小。

$ docker run  --rm centos:7 df -h |grep shm
shm              64M     0   64M   0% /dev/shm
$ docker run  --rm --shm-size 128M centos:7 df -h |grep shm
shm             128M     0  128M   0% /dev/shm

k8s环境下如何支持更大的shared memory

kubernetes empty dir:

emptyDir volume在一些场景下非常有用,例如在Pod的不同container之间需要共享数据,
可以将同一个emptyDir挂载到两个container中来达到共享的目的。

此时,emtpyDir实际是一个宿主机上的目录,本质上还是磁盘(比如通过sidecar的方式来收集日志)。

kubernetes提供来一种特殊的emptyDir:medium为memory的临时存储。
用户可以将memory介质的emptyDir挂到任何目录,然后将这个目录当作一个高性能的文件系统来使用。

可以将memory介质的empty dir,挂载到 /dev/shm 下,解决共享内存 /dev/shm 不够用的问题

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: xxx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xxx
  template:
    metadata:
      labels:
        app: xxx
    spec:
      containers:
      - args:
        - infinity
        command:
        - sleep
        image: centos:7
        name: centos
        volumeMounts:
        - mountPath: /dev/shm
          name: cache-volume
      volumes:
      - emptyDir:
          medium: Memory
          sizeLimit: 128Mi
        name: cache-volume

k8s环境下使用更大的shared memory可能发生的问题

使用empty dir的缺点:

1、影响kubernetes调度,因为empty dir并不涉及node的resources,
这样会造成Pod“偷偷”使用了node的内存,但是调度器并不知晓;

2、用户不能及时感知到内存不可用

共享内存受cgroup限制吗

由于普通的内存是受cgroup限制的,那么自然会有一个问题:共享内存受cgroup限制吗?

如果受限制,那么只要给Pod设置memroy limit就可以了,至于用户将内存是用于共享内存,
还是用于普通用途,kubernetes层面并不需要台关心:因为共享内存并不是一个“独立”的内存,
只是包含在memory limit里进行调度,因此也不会影响调度。

需要显示设置sizeLimit

kubelet的eviction manager会监控pod的emptyDir卷使用的空间大小,当使用空间超过该值时,会将该Pod驱逐

可以使用sizeLimit的大小

1、当 Pod 并没有设置memory limit时,此时 shm大小为node的Allocateable Memory大小

2、当Pod 设置了memory limit 但未设置sizeLimit时,shm 大小为Pod 的memory Limit

3、当Pod的medium emptyDir设置sizeLimit时,shm大小为sizeLimit

如何防止pod由于使用共享内存而偷用了node的内存,没被调度器发现

pod的memory request中需要把自己要使用内存的和pod挂载的shm大小一起算进来

相关文章:

  • SpringBoot2.6.8 多环境配置
  • 安利网课查题接口系统
  • spring-security-oauth2之WebSecurityConfigurerAdapter浅析
  • Windows与网络基础-14-NTFS权限规则
  • 【Python】列表生成式应用的八重境界
  • SOA、ESB、微服务、分布式概念及专业名词阐述
  • IDEA 集成 Github(八)——Git
  • Go程序(Grpc服务)协程数暴涨的原因排查分析
  • Unity新的Input System
  • YOLOv5代码解析(二)
  • kafka系列(一)安装使用及基本原理
  • C# 第七章『I/O数据流』◆第4节:数据流—FileStream 类
  • 物联网开发笔记(2)- 使用Wokwi仿真树莓派Pico点亮LED灯代码分析
  • Vue路由实例
  • 第一章 软考架构师之计算机系统组成与体系结构
  • __proto__ 和 prototype的关系
  • C++入门教程(10):for 语句
  • dva中组件的懒加载
  • GraphQL学习过程应该是这样的
  • leetcode讲解--894. All Possible Full Binary Trees
  • NSTimer学习笔记
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • springMvc学习笔记(2)
  • 创建一种深思熟虑的文化
  • 分类模型——Logistics Regression
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 面试遇到的一些题
  • 携程小程序初体验
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​configparser --- 配置文件解析器​
  • ( 10 )MySQL中的外键
  • (4)logging(日志模块)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • .net core 6 redis操作类
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET多线程执行函数
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET中使用Redis (二)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [1] 平面(Plane)图形的生成算法
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [autojs]逍遥模拟器和vscode对接
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [exgcd] Jzoj P1158 荒岛野人