本文目录导读:

在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}'
}
注意事项
- 性能考虑:错误的NUMA配置可能导致性能下降
- 硬件支持:确保CPU和内存控制器支持NUMA
- 操作系统支持:Linux内核需要NUMA支持(大多数现代发行版都支持)
- 资源隔离:使用
--cpuset-mems确保内存分配在指定NUMA节点
这些脚本可以根据具体需求进行调整,确保容器应用获得最佳的NUMA性能。