Shell脚本如何配置容器共享内存大小

wen 实用脚本 2

本文目录导读:

Shell脚本如何配置容器共享内存大小

  1. Docker 容器
  2. Docker Compose
  3. Podman 容器
  4. Kubernetes Pod
  5. 在脚本中自动检测和设置
  6. 验证共享内存配置
  7. 完整示例脚本
  8. 注意事项

在Shell脚本中配置容器共享内存(Shared Memory)大小,主要取决于你使用的容器运行时,以下是几种常见场景的配置方法:

Docker 容器

使用 --shm-size 参数

#!/bin/bash
# 设置共享内存为 256MB
docker run --shm-size=256m your-image
# 设置共享内存为 2GB
docker run --shm-size=2g your-image
# 使用变量
SHM_SIZE="512m"
docker run --shm-size=$SHM_SIZE your-image

临时挂载 tmpfs(替代方案)

#!/bin/bash
# 挂载 tmpfs 作为共享内存
docker run --mount type=tmpfs,destination=/dev/shm,tmpfs-size=1g your-image
# 或者使用老式语法
docker run --tmpfs /dev/shm:rw,size=1g your-image

Docker Compose

# docker-compose.yml
version: '3.8'
services:
  myapp:
    image: your-image
    shm_size: '256m'  # 或 '1g', '512m'
    # 或者使用 tmpfs 挂载
    tmpfs:
      - /dev/shm:rw,size=1g

Podman 容器

#!/bin/bash
# 与 Docker 语法类似
podman run --shm-size=256m your-image
# 或使用 tmpfs
podman run --tmpfs /dev/shm:rw,size=256m your-image

Kubernetes Pod

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: myapp
    image: your-image
    volumeMounts:
    - mountPath: /dev/shm
      name: shm
  volumes:
  - name: shm
    emptyDir:
      medium: Memory
      sizeLimit: "256Mi"  # 设置共享内存大小限制

在脚本中自动检测和设置

#!/bin/bash
# 函数:设置 Docker 容器共享内存
setup_docker_shm() {
    local image_name=$1
    local shm_size=${2:-256m}  # 默认 256MB
    echo "启动容器 $image_name,共享内存大小: $shm_size"
    docker run --shm-size=$shm_size -d $image_name
}
# 函数:根据系统内存动态计算共享内存
calculate_shm_size() {
    local total_mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    local total_mem_mb=$((total_mem_kb / 1024))
    # 设置为总内存的 20%
    local shm_mb=$((total_mem_mb * 20 / 100))
    echo "${shm_mb}m"
}
# 使用示例
SHM_SIZE=$(calculate_shm_size)
echo "自动计算的共享内存大小: $SHM_SIZE"
setup_docker_shm "my-app" $SHM_SIZE

验证共享内存配置

#!/bin/bash
# 检查容器内的共享内存大小
check_container_shm() {
    local container_name=$1
    echo "检查容器 $container_name 的共享内存..."
    docker exec $container_name df -h /dev/shm
    docker exec $container_name cat /proc/meminfo | grep Shmem
}
# 使用示例
check_container_shm "my-running-container"

完整示例脚本

#!/bin/bash
# 配置容器共享内存脚本
# 用法: ./setup_container.sh [image_name] [shm_size]
IMAGE_NAME=${1:-"ubuntu:latest"}
SHM_SIZE=${2:-"256m"}
CONTAINER_NAME="shared-memory-test"
echo "=== 配置容器共享内存 ==="
echo "镜像: $IMAGE_NAME"
echo "共享内存大小: $SHM_SIZE"
# 清理旧容器
docker rm -f $CONTAINER_NAME 2>/dev/null
# 启动容器
echo "启动容器..."
docker run -d \
    --name $CONTAINER_NAME \
    --shm-size=$SHM_SIZE \
    $IMAGE_NAME \
    sleep 3600
# 验证配置
echo "验证共享内存配置..."
docker exec $CONTAINER_NAME df -h /dev/shm
echo "完成!"

注意事项

  1. 分配大小:共享内存大小取决于应用需求,对于使用 IPC(进程间通信)或 shared memory 的应用(如 Oracle、PostgreSQL、PyTorch 等)需要足够大的 /dev/shm

  2. 单位说明

    • b (字节)
    • k (千字节)
    • m (兆字节)
    • g (吉字节)
  3. 系统限制:确保 Docker 守护进程配置允许分配所需大小的共享内存,检查 /etc/docker/daemon.json 中的相关设置。

  4. 性能考虑:不要设置过大,以免浪费主机内存,通常设置为总内存的 20-30% 即可。

抱歉,评论功能暂时关闭!