show_mem.sh
#!/bin/bash
PROC_MEM=/proc/meminfo
show_summary_mem()
{
printf "\t\t\t-----------------------\n"
printf "\t\t\t| MEMORY SUMMARY |\n"
printf "\t\t\t-----------------------\n"
used_rat=$(echo $1 $2 | awk '{printf("%-2.2f",($1-$2)*100/$1)}')
printf " -----------------------------------------------------------------------\n"
printf " | total mem: %-8dKB | free mem: %-8dKB | used ratio: %-2.2f%% |\n" $1 $2 $used_rat
printf " -----------------------------------------------------------------------\n"
used_mem=$(($1-$2)) #占使用内存的比值
slab_rat=$(echo $used_mem $3 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
stack_rat=$(echo $used_mem $4 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
table_rat=$(echo $used_mem $5 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
vmalloc_rat=$(echo $used_mem $6 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
other_rat=$(echo $used_mem $7 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
printf " -----------------------------------------------------------------------\n"
printf " | KERNEL SPACE |\n"
printf " -----------------------------------------------------------------------\n"
printf " | slab | kernel stack | page table | vmalloc used | other+X |\n"
printf " | %-8dKB | %-7dKB | %-7dKB | %-8dKB | %-6dKB +X |\n" $3 $4 $5 $6 $7
printf " | %-2.3f%% | %-2.3f%% | %-2.3f%% | %-2.3f%% | %-2.3f%% |\n" $slab_rat $stack_rat $table_rat $vmalloc_rat $other_rat
printf " -----------------------------------------------------------------------\n"
task_rat=$(echo $used_mem $8 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
unmap_rat=$(echo $used_mem $9 | awk '{printf("%-2.3f",$2*100/$used_mem)}')
buff_rat=$(echo $used_mem ${10} | awk '{printf("%-2.3f",$2*100/$used_mem)}')
huge_rat=$(echo $used_mem ${11} | awk '{printf("%-2.3f",$2*100/$used_mem)}')
printf " -----------------------------------------------------------------------\n"
printf " | USER SPACE |\n"
printf " -----------------------------------------------------------------------\n"
printf " | ALL Process | Cached - Mapped | Buffers | Huge page |\n"
printf " | %-8dKB | %-8dKB | %-8dKB | %-8dKB |\n" $8 $9 ${10} ${11}
printf " | %-2.3f%% | %-2.3f%% | %-2.3f%% | %-2.3f%% |\n" $task_rat $unmap_rat $buff_rat $huge_rat
printf " -----------------------------------------------------------------------\n"
}
#系统内存使用情况
total_k=$(grep MemTotal $PROC_MEM | awk '{print $2}')
free_k=$(grep MemFree $PROC_MEM | awk '{print $2}')
#内核空间内存分布
slab_k=$(grep -i slab $PROC_MEM | awk '{print $2}')
kerStack_k=$(grep KernelStack $PROC_MEM | awk '{print $2}')
pageTables_k=$(grep PageTables $PROC_MEM | awk '{print $2}')
vmallocUsed_k=$(grep vmalloc /proc/vmallocinfo | awk 'BEGIN {vm_sum=0} {vm_sum+=$2} END {print vm_sum/1024}')
hdCrpt_k=$(grep HardwareCorrupted $PROC_MEM | awk '{print $2}')
bounce_k=$(grep Bounce $PROC_MEM | awk '{print $2}')
otherX=$(($hdCrpt_k + $bounce_k + $bounce_k))
#用户空间内存分布
task_all=$(grep -w Pss /proc/[1-9]*/smaps | awk 'BEGIN {sum=0} {sum+=$2} END {print sum}')
cached_k=$(grep -w Cached $PROC_MEM | awk '{print $2}')
mapped_k=$(grep -wi mapped $PROC_MEM | awk '{print $2}')
buffer_k=$(grep -wi buffers $PROC_MEM | awk '{print $2}')
hugepage_total_k=$(grep -w HugePages_Total $PROC_MEM | awk '{print $2}')
hugepage_size=$(grep -w Hugepagesize $PROC_MEM | awk '{print $2}')
hugepage_k=$(expr $hugepage_total_k \* $hugepage_size)
unmapped=$(($cached_k - $mapped_k))
show_summary_mem $total_k $free_k $slab_k $kerStack_k $pageTables_k $vmallocUsed_k $otherX $task_all $unmapped $buffer_k $hugepage_k
get_mem_info.sh
#!/bin/sh
TMP_FILE=$(mktemp tmp.XXXX)
for dir in `ls /proc | grep [1-9]*`
do
if [ -e /proc/$dir/comm ];then
tmp_comm=$(cat /proc/$dir/comm)
if [ $tmp_comm == "get_mem_info.sh" ];then
continue
fi
cat /proc/$dir/smaps > tmp_smaps
TEXT=$(head -n 5 tmp_smaps | grep -w "Size" | awk '{print $2}')
Rss=$(cat tmp_smaps | grep -w "Rss" | awk 'BEGIN { sum=0 } { sum+= $2 } END{print sum}')
if [ $Rss == "0" ];then
rm tmp_smaps
continue
fi
USS=$(cat tmp_smaps | grep -e "Private_Clean" -e "Private_Dirty" | awk 'BEGIN { sum=0 } { sum+= $2 } END{print sum}')
Pss=$(cat tmp_smaps | grep -w "Pss" | awk 'BEGIN { sum=0 } { sum+= $2 } END{print sum}')
Anonymous=$(cat tmp_smaps | grep -w "Anonymous" | awk 'BEGIN { sum=0 } { sum+= $2 } END{print sum}')
Swap=$(cat tmp_smaps | grep -w "Swap" | awk 'BEGIN { sum=0 } { sum+= $2 } END{print sum}')
printf "%-10s%-18s%10s%10s%10s%10s%14s%10s\n" "$dir" "$tmp_comm" "$TEXT" "$Rss" "$USS" "$Pss" "$Anonymous" "$Swap" >> $TMP_FILE
rm tmp_smaps
fi
done
printf "%-10s%-18s%10s%10s%10s%10s%14s%10s\n" "PID" "ELF_name" "TEXT(KB)" "Rss(KB)" "Uss(KB)" "Pss(KB)" "Anonymous(KB)" "Swap(KB)"
cat $TMP_FILE | sort -k 6 -nr
rm $TMP_FILE