标准大页内存占用信息统计
默认单位显示(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"
作者:wanghongwei
版权声明:本作品遵循 CC BY-NC-ND 4.0 版权协议,商业转载请联系作者获得授权,非商业转载请附上原文出处链接及本声明。