Shell脚本如何配置容器NUMA策略

wen 实用脚本 1

本文目录导读:

Shell脚本如何配置容器NUMA策略

  1. 使用 numactl 命令
  2. Docker原生NUMA支持
  3. 完整的Shell脚本示例
  4. Kubernetes/OpenShift环境
  5. 高级NUMA配置脚本
  6. 验证和监控脚本
  7. 注意事项

在Shell脚本中配置容器的NUMA策略,主要通过以下几种方式实现:

使用 numactl 命令

基本用法

# 绑定到特定CPU核心和内存节点
numactl --cpunodebind=0 --membind=0 /path/to/your/application
# 绑定到多个节点
numactl --cpunodebind=0,1 --membind=0,1 /path/to/your/application

在Docker容器中的应用

#!/bin/bash
# 启动容器并绑定NUMA节点
numactl --cpunodebind=0 --membind=0 \
    docker run -d --name my-container \
    --cpuset-cpus="0-3" \
    --memory="4g" \
    my-image:latest

Docker原生NUMA支持

使用 --cpuset-cpus--cpuset-mems

#!/bin/bash
# 配置容器使用特定CPU和内存节点
docker run -d \
    --name numa-aware-container \
    --cpuset-cpus="0-3" \
    --cpuset-mems="0" \
    --memory="4g" \
    my-image:latest

使用 --cpuset-cpus 与CPU核心绑定

#!/bin/bash
# 绑定到特定物理核心
docker run -d \
    --name perf-container \
    --cpuset-cpus="0,2,4,6" \
    --cpuset-mems="0" \
    my-image:latest

完整的Shell脚本示例

#!/bin/bash
# 容器NUMA策略配置脚本
# 检测NUMA拓扑
echo "检测NUMA拓扑..."
numactl --hardware
# 配置参数
CONTAINER_NAME="my-app"
IMAGE_NAME="my-image:latest"
NUMA_NODE=0
CPU_CORES="0-7"
MEMORY_LIMIT="8g"
# 检查numactl是否安装
if ! command -v numactl &> /dev/null; then
    echo "安装numactl..."
    sudo apt-get update && sudo apt-get install -y numactl
fi
# 启动容器并配置NUMA策略
echo "启动容器并配置NUMA策略..."
numactl --cpunodebind=$NUMA_NODE --membind=$NUMA_NODE \
    docker run -d \
    --name $CONTAINER_NAME \
    --cpuset-cpus="$CPU_CORES" \
    --cpuset-mems="$NUMA_NODE" \
    --memory="$MEMORY_LIMIT" \
    --memory-swap="$MEMORY_LIMIT" \
    $IMAGE_NAME
# 验证配置
echo "验证容器NUMA配置..."
docker inspect $CONTAINER_NAME | grep -A 5 "CpusetCpus\|CpusetMems"

Kubernetes/OpenShift环境

#!/bin/bash
# 创建Pod并配置NUMA策略
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: numa-aware-pod
spec:
  containers:
  - name: my-container
    image: my-image:latest
    resources:
      requests:
        memory: "4Gi"
        cpu: "4"
      limits:
        memory: "4Gi"
        cpu: "4"
    env:
    - name: NUMA_NODE
      value: "0"
  nodeSelector:
    kubernetes.io/hostname: specific-node
EOF

高级NUMA配置脚本

#!/bin/bash
# 高级NUMA配置函数
configure_numa_policy() {
    local container_name=$1
    local numa_nodes=$2
    local cpu_cores=$3
    local memory_limit=$4
    # 转换为逗号分隔的字符串
    local numa_str=$(echo $numa_nodes | tr ' ' ',')
    local cpu_str=$(echo $cpu_cores | tr ' ' ',')
    echo "配置容器 $container_name 的NUMA策略..."
    echo "NUMA节点: $numa_str"
    echo "CPU核心: $cpu_str"
    echo "内存限制: $memory_limit"
    # 绑定NUMA节点启动容器
    for node in $numa_nodes; do
        numactl --cpunodebind=$node --membind=$node \
            docker run -d \
            --name "${container_name}-node${node}" \
            --cpuset-cpus="$cpu_str" \
            --cpuset-mems="$node" \
            --memory="$memory_limit" \
            my-image:latest
    done
}
# 使用示例
configure_numa_policy "web-app" "0 1" "0-3,8-11" "4g"

验证和监控脚本

#!/bin/bash
# 验证容器NUMA配置
verify_numa_config() {
    local container_name=$1
    echo "验证容器 $container_name 的NUMA配置..."
    # 检查cgroup配置
    docker inspect $container_name | jq '.[0].HostConfig.CpuSetCpus, .[0].HostConfig.CpuSetMems'
    # 检查进程绑定
    docker top $container_name | awk '{print $1}' | while read pid; do
        echo "进程 $pid 的NUMA配置:"
        numactl --show $pid 2>/dev/null || echo "无法获取进程信息"
    done
}
# 监控NUMA使用情况
monitor_numa_usage() {
    local container_name=$1
    echo "监控容器 $container_name 的NUMA使用情况..."
    docker stats $container_name --no-stream | awk 'NR>1 {print $2, $3, $4}'
}

注意事项

  1. 性能考虑:错误的NUMA配置可能导致性能下降
  2. 硬件支持:确保CPU和内存控制器支持NUMA
  3. 操作系统支持:Linux内核需要NUMA支持(大多数现代发行版都支持)
  4. 资源隔离:使用 --cpuset-mems 确保内存分配在指定NUMA节点

这些脚本可以根据具体需求进行调整,确保容器应用获得最佳的NUMA性能。

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