k8s开发 -- 容器内存 和 cpu使用率

# 获取容器内进程占用cpu的百分比
get_container_process_cpu_usage()
{
  local pid=$1
  # 在一个调度周期里被允许的运行时间,比如这个值为 50000 时,就是 50us。默认值是-1,即没有限制
  local cpu_quota_us_path=/sys/fs/cgroup/cpu/cpu.cfs_quota_us
  # 一个调度周期。默认值是100000,也就 100us
  local cpu_period_us_path=/sys/fs/cgroup/cpu/cpu.cfs_period_us
  if [ -f $cpu_quota_us_path ] && [ -f $cpu_period_us_path ];then
    local cpu_quota_us=$(cat ${cpu_quota_us_path})
    local cpu_period_us=$(cat ${cpu_period_us_path})
    local cpu_info=$(top -b -n 1 | awk -v_check_pid=${pid} '{if($1==_check_pid) print $9}')
    if [ -z "${cpu_info}" ];then
	    cpu_info="0.00"
	  fi
    # 当cpu_quota_us为-1时,代表容器对cpu资源没有限制
    if [ ${cpu_quota_us} == '-1' ];then
      echo ""
    else
	    cpu_info=$(echo "scale=4;$cpu_info/($cpu_quota_us/$cpu_period_us)"|bc|awk '{printf "%.2f",$0}')
      echo ${cpu_info}|awk '{printf "%.2f",$0}'
    fi
  else
    echo ""
  fi
}

# 获取容器内进程占用内存的百分比
get_container_process_mem_usage()
{
  local pid=$1
  # 宿主机内存上限,单位kb,需要转为byte
  host_mem_total=$(cat /proc/meminfo|grep MemTotal|awk '{print $2*1024}')
  # 保存容器中内存上限的文件路径
  local mem_limit_in_bytes_path=/sys/fs/cgroup/memory/memory.limit_in_bytes
  if [ -f $mem_limit_in_bytes_path ];then
	  # 单位byte
    local container_total_mem=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)
    # 当容器总内存超过宿主机总内存时,使用查看宿主机中进程占用内存方式来查看容器中占用内存
    if [ ${container_total_mem} -ge ${host_mem_total} ];then
      echo ""
    else
      local mem_info=$(ps -aux | awk -v_check_pid=${pid} '{if($2==_check_pid) print $6}')
      if [ -z "${mem_info}" ];then
        mem_info="0.00"
      fi
      mem_info=$(echo "scale=4;($mem_info*1024/$container_total_mem)*100"|bc|awk '{printf "%.2f",$0}')
      echo ${mem_info}|awk '{printf "%.2f",$0}'
    fi
  else
    echo ""
  fi
}

# 获取物理机内进程用cpu的百分比
get_pmachine_process_cpu_usage()
{
	local pid=$1
	#$3是cpu
	local cpu_info=$(top -b -n 1 | awk -v_check_pid=${pid} '{if($1==_check_pid) print $9}')
	if [ -z "${cpu_info}" ];then
	  cpu_info="0.00"
	fi
    
    total_core=$(cat /proc/cpuinfo | grep -w "processor" | wc -l)
    cpu_info=$(echo "scale=4;$cpu_info/$total_core"|bc|awk '{printf "%.2f",$0}')
    echo ${cpu_info}|awk '{printf "%.2f",$0}'
}

# 获取物理机内进程用内存的百分比
get_pmachine_process_mem_usage()
{
	local pid=$1
	#$4是内存
	local mem_info=$(ps aux | awk -v_check_pid=${pid} '{if($2==_check_pid) print $4}')
	if [ -z "${mem_info}" ];then
	  mem_info="0.00"
	fi
	echo ${mem_info}
}
posted @ 2026-03-12 14:39  静水深耕,云停风驻  阅读(2)  评论(0)    收藏  举报