标准大页内存占用信息统计

https://www.cnblogs.com/wanghongwei-dev / 2024-09-28 / 原文

默认单位显示(KB)

#!/bin/bash

# 初始化所有进程的统计变量
TOTAL_PRIVATE_HUGETLB=0
TOTAL_SHARED_HUGETLB=0
TOTAL_HUGE_PAGE_SIZE=0

KEYWORDS="Hugetlb"

echo -e "PID | Private_Hugetlb (kB) | Shared_Hugetlb (kB) | Total HugePages (kB)"
echo "-----------------------------------------------------------------------"

for PID in /proc/[0-9]*; do
  PID=${PID##*/}
  # 初始化单个进程的统计变量
  PRIVATE_HUGETLB=0
  SHARED_HUGETLB=0
  PROCESS_HUGE_PAGE_TOTAL=0

  # 获取进程的大页内存信息
  PROCESS_HUGE_PAGE_INFO=$(cat /proc/${PID}/smaps | grep -v " 0 kB" | grep "${KEYWORDS}")

  while read line; do
    PAGE_TYPE=$(echo "$line" | awk -F: '{print $1}')
    PAGE_SIZE=$(echo "$line" | awk '{print $2}')

    case $PAGE_TYPE in
      Private_Hugetlb) PRIVATE_HUGETLB=$((PRIVATE_HUGETLB + PAGE_SIZE)) ;;
      Shared_Hugetlb) SHARED_HUGETLB=$((SHARED_HUGETLB + PAGE_SIZE)) ;;
      *) : ;;
    esac
    PROCESS_HUGE_PAGE_TOTAL=$((PROCESS_HUGE_PAGE_TOTAL + PAGE_SIZE))
  done <<< "$PROCESS_HUGE_PAGE_INFO"

  # 累加全局统计
  TOTAL_PRIVATE_HUGETLB=$((TOTAL_PRIVATE_HUGETLB + PRIVATE_HUGETLB))
  TOTAL_SHARED_HUGETLB=$((TOTAL_SHARED_HUGETLB + SHARED_HUGETLB))
  TOTAL_HUGE_PAGE_SIZE=$((TOTAL_HUGE_PAGE_SIZE + PROCESS_HUGE_PAGE_TOTAL))

  # 如果进程使用了大页,则打印
  if [[ $PROCESS_HUGE_PAGE_TOTAL -gt 0 ]]; then
    printf "%-5s | %-20s | %-20s | %-20s | %-20s | %-20s\n" \
      "$PID" \
      "$PRIVATE_HUGETLB kB" \
      "$SHARED_HUGETLB kB" \
      "$PROCESS_HUGE_PAGE_TOTAL kB"
  fi
done

# 打印总统计
echo "Total: | $TOTAL_PRIVATE_HUGETLB kB | $TOTAL_SHARED_HUGETLB kB | $TOTAL_HUGE_PAGE_SIZE kB"

单位转换为GB

#!/bin/bash

# 初始化所有进程的统计变量
TOTAL_PRIVATE_HUGETLB_KB=0
TOTAL_SHARED_HUGETLB_KB=0
TOTAL_HUGE_PAGE_SIZE_KB=0

KEYWORDS="Hugetlb"

echo -e "PID | Private_Hugetlb (GB) | Shared_Hugetlb (GB) | Total HugePages (GB)"
echo "-----------------------------------------------------------------------"

for PID in /proc/[0-9]*; do
  PID=${PID##*/}
  # 初始化单个进程的统计变量
  PRIVATE_HUGETLB_KB=0
  SHARED_HUGETLB_KB=0
  PROCESS_HUGE_PAGE_TOTAL_KB=0

  # 获取进程的大页内存信息
  PROCESS_HUGE_PAGE_INFO=$(cat /proc/${PID}/smaps | grep -v " 0 kB" | grep "${KEYWORDS}")

  while read line; do
    PAGE_TYPE=$(echo "$line" | awk -F: '{print $1}')
    PAGE_SIZE_KB=$(echo "$line" | awk '{print $2}')

    case $PAGE_TYPE in
      Private_Hugetlb) PRIVATE_HUGETLB_KB=$((PRIVATE_HUGETLB_KB + PAGE_SIZE_KB)) ;;
      Shared_Hugetlb) SHARED_HUGETLB_KB=$((SHARED_HUGETLB_KB + PAGE_SIZE_KB)) ;;
      *) : ;;
    esac
    PROCESS_HUGE_PAGE_TOTAL_KB=$((PROCESS_HUGE_PAGE_TOTAL_KB + PAGE_SIZE_KB))
  done <<< "$PROCESS_HUGE_PAGE_INFO"

  # 累加全局统计
  TOTAL_PRIVATE_HUGETLB_KB=$((TOTAL_PRIVATE_HUGETLB_KB + PRIVATE_HUGETLB_KB))
  TOTAL_SHARED_HUGETLB_KB=$((TOTAL_SHARED_HUGETLB_KB + SHARED_HUGETLB_KB))
  TOTAL_HUGE_PAGE_SIZE_KB=$((TOTAL_HUGE_PAGE_SIZE_KB + PROCESS_HUGE_PAGE_TOTAL_KB))

  # 转换为GB
  PRIVATE_HUGETLB_GB=$(echo "scale=2; $PRIVATE_HUGETLB_KB / 1024 / 1024" | bc)
  SHARED_HUGETLB_GB=$(echo "scale=2; $SHARED_HUGETLB_KB / 1024 / 1024" | bc)
  PROCESS_HUGE_PAGE_TOTAL_GB=$(echo "scale=2; $PROCESS_HUGE_PAGE_TOTAL_KB / 1024 / 1024" | bc)

  # 如果进程使用了大页,则打印
  if [[ $PROCESS_HUGE_PAGE_TOTAL_GB -gt 0 ]]; then
    printf "%-5s | %-20s | %-20s | %-20s\n" \
      "$PID" \
      "$PRIVATE_HUGETLB_GB GB" \
      "$SHARED_HUGETLB_GB GB" \
      "$PROCESS_HUGE_PAGE_TOTAL_GB GB"
  fi
done

# 打印总统计(转换为GB)
TOTAL_PRIVATE_HUGETLB_GB=$(echo "scale=2; $TOTAL_PRIVATE_HUGETLB_KB / 1024 / 1024" | bc)
TOTAL_SHARED_HUGETLB_GB=$(echo "scale=2; $TOTAL_SHARED_HUGETLB_KB / 1024 / 1024" | bc)
TOTAL_HUGE_PAGE_SIZE_GB=$(echo "scale=2; $TOTAL_HUGE_PAGE_SIZE_KB / 1024 / 1024" | bc)
echo "Total: | $TOTAL_PRIVATE_HUGETLB_GB GB | $TOTAL_SHARED_HUGETLB_GB GB | $TOTAL_HUGE_PAGE_SIZE_GB GB"