heroyf @ heroyf.com

pod中获取cpu和mem限制

Jan 5 · 5min网络

读取方式

读取/sys/fs/cgroup/cpu,cpuacct/cpu.shares这个文件里的数,将这个值除以1024,就是你给容器设置的cpu request数。

读取/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us这个文件里的数,记作A

再读取/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us这个文件里的数,记作B

那么A/B就是你给容器设置的limit数。

获取pod中的mem限制

#!/bin/bash
# 获取容器内存限制.
get_mem_limit() {
  memory_total=$(awk '/MemTotal:/ {printf("%d", $2/1024)}' /proc/meminfo)
  if [[ -f /sys/fs/cgroup/memory/memory.stat ]]; then
    memory_limit_stat=$(awk '/hierarchical_memory_limit/ {printf("%d", $2/1024/1024)}' /sys/fs/cgroup/memory/memory.stat)
  fi
  # 如果内存总量大于限制内存,说明容器是开启了内存限制的(单体docker有时候没限制内存),此时取内存限制值,单位为MB
  if [[ $memory_total -gt ${memory_limit_stat} ]]; then
    export MEM_LIMIT=${memory_limit_stat}
  else
    # 未做内存限制时将变量设置为0,方便后面的判断
    export MEM_LIMIT=0
  fi
  echo ${MEM_LIMIT}
}

获取pod中的cpu限制

# 获取容器CPU限制.
get_cpu_limit() {
  cfs_quota_us=$(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us)
  cfs_period_us=$(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us)
  cpu_limit=$(expr ${cfs_quota_us} / ${cfs_period_us})
  if [[ ${cpu_limit} -eq 0 ]]; then
    export CPU_LIMIT=0
  else
    export CPU_LIMIT=${cpu_limit}
  fi
  echo ${CPU_LIMIT}
}

使用方式

  • 方式1:直接执行函数,从环境变量中拿
get_mem_limit
get_cpu_limit
echo ${MEM_LIMIT}
echo ${CPU_LIMIT}
  • 方式2:赋值方式获取
mem_limit=$(get_mem_limit)
cpu_limit=${get_cpu_limit}