Shell脚本如何配置容器内存交换

wen 实用脚本 1

本文目录导读:

Shell脚本如何配置容器内存交换

  1. 限制容器内存交换
  2. 完全禁用内存交换
  3. 完整的Shell脚本示例
  4. 验证配置是否生效
  5. 注意事项
  6. 生产环境建议脚本

在Shell脚本中配置容器内存交换(Swap),主要涉及 限制容器内存交换完全禁用内存交换 两种情况,以下是具体实现方法:

限制容器内存交换

通过Docker run参数

#!/bin/bash
# 限制内存交换为512MB
docker run -it \
  --memory="1g" \
  --memory-swap="1.5g" \
  --memory-swappiness="0" \
  ubuntu bash
  • --memory:物理内存限制
  • --memory-swap:总内存(物理+交换)限制
  • --memory-swappiness:内核交换行为(0-100)

通过docker-compose

# docker-compose.yml
version: '3'
services:
  app:
    image: ubuntu
    deploy:
      resources:
        limits:
          memory: 1G
          memory-swap: 1.5G
    sysctls:
      - vm.swappiness=0

完全禁用内存交换

通过cgroup设置

#!/bin/bash
CONTAINER_ID=$(docker ps -q --filter "name=mycontainer")
# 禁用交换
echo 0 > /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.swappiness
echo 0 > /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.use_hierarchy
# 设置内存和交换限制相同值
docker update --memory="512m" --memory-swap="512m" $CONTAINER_ID

通过Docker run直接禁用

#!/bin/bash
docker run -it \
  --memory="1g" \
  --memory-swap="1g" \
  --kernel-memory="512m" \
  ubuntu bash

完整的Shell脚本示例

#!/bin/bash
configure_memory_swap() {
    local CONTAINER_NAME=$1
    local MEMORY_LIMIT=$2  # 如:512m、1g
    local SWAP_ENABLED=$3  # true/false
    if [ "$SWAP_ENABLED" = "false" ]; then
        # 禁用交换:设置内存和交换相同值
        docker run -d \
            --name="$CONTAINER_NAME" \
            --memory="$MEMORY_LIMIT" \
            --memory-swap="$MEMORY_LIMIT" \
            --memory-swappiness="0" \
            ubuntu sleep infinity
    else
        # 启用有限交换
        local SWAP_LIMIT=$(echo "$MEMORY_LIMIT" | sed 's/[0-9]*//')  # 提取单位
        local MEM_VAL=$(echo "$MEMORY_LIMIT" | sed 's/[a-zA-Z]*//')  # 提取数值
        SWAP_LIMIT="${MEM_VAL}${SWAP_LIMIT}"
        docker run -d \
            --name="$CONTAINER_NAME" \
            --memory="$MEMORY_LIMIT" \
            --memory-swap="$MEMORY_LIMIT" \
            --memory-swappiness="10" \
            ubuntu sleep infinity
    fi
}
# 使用示例
configure_memory_swap "myapp" "1g" false

验证配置是否生效

#!/bin/bash
verify_swap_config() {
    local CONTAINER_ID=$1
    echo "=== 内存交换配置验证 ==="
    docker inspect $CONTAINER_ID | jq '.[0].HostConfig.MemorySwap'
    echo "=== 容器内查看swap状态 ==="
    docker exec $CONTAINER_ID cat /proc/meminfo | grep -i swap
    echo "=== cgroup交换配置 ==="
    docker exec $CONTAINER_ID cat /sys/fs/cgroup/memory/memory.swappiness
}
# 使用示例
verify_swap_config $(docker ps -q -f name=myapp)

注意事项

系统层面配置

#!/bin/bash
# 系统禁用swap(会影响所有容器)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
# 设置内核swappiness
echo "vm.swappiness = 0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

兼容性检查脚本

#!/bin/bash
check_swap_config() {
    echo "检查Docker版本:"
    docker version --format '{{.Server.Version}}'
    echo "检查cgroup版本:"
    docker info | grep "Cgroup"
    echo "当前系统swap:"
    free -h | grep -i swap
    # 检查是否支持memory-swap配置
    if [[ $(docker version --format '{{.Server.Version}}') > "17.05" ]]; then
        echo "✅ 支持memory-swap配置"
    else
        echo "❌ Docker版本过低,需升级"
    fi
}
check_swap_config

生产环境建议脚本

#!/bin/bash
# 生产环境容器内存交换配置
PRODUCTION_MEM_SWAP_CONFIG() {
    local SERVICE=$1
    local MEMORY="2g"
    echo "部署 $SERVICE 并禁用swap..."
    docker run -d \
        --name="$SERVICE" \
        --memory="$MEMORY" \
        --memory-swap="$MEMORY" \
        --memory-swappiness="0" \
        --kernel-memory="1g" \
        --oom-kill-disable=false \
        --restart=always \
        $SERVICE:latest
    echo "验证swap配置:"
    docker inspect $SERVICE | grep -E "Memory|Swap"
}
PRODUCTION_MEM_SWAP_CONFIG "my-production-app"

这些脚本可以帮助你根据不同的需求配置容器内存交换行为,建议在生产环境中禁用或严格限制内存交换,以避免性能问题。

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