本文目录导读:

在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 "完成!"
注意事项
-
分配大小:共享内存大小取决于应用需求,对于使用 IPC(进程间通信)或 shared memory 的应用(如 Oracle、PostgreSQL、PyTorch 等)需要足够大的 /dev/shm
-
单位说明:
b(字节)k(千字节)m(兆字节)g(吉字节)
-
系统限制:确保 Docker 守护进程配置允许分配所需大小的共享内存,检查
/etc/docker/daemon.json中的相关设置。 -
性能考虑:不要设置过大,以免浪费主机内存,通常设置为总内存的 20-30% 即可。