Code:
#!/bin/sh
set -f
PATH=/usr/xpg4/bin:/usr/bin:/bin:/usr/sbin:/usr/ucb
export PATH
if [ -x /usr/sbin/swap ]; then
vmempct=`swap -s |
awk '{gsub("([0-9])k","\1"); print int($9*100/($11+$9))}'
`
else
# To compensate the Linux memory strategy, put a f=2 factor
vmempct=`free |
awk '/^[Mm]em/ {used+=$3/f; free+=$4/f} /^[Ss]wap/ {used+=$3; free+=$4} END {print int(used*100/(free+used))}' f=2
`
fi
printf "%-10s %d %%\n" "#vmemory:" $vmempct
load=`uptime | awk '{sub(".*[Ll]oad[^0-9]*",""); sub("[^0-9.].*$",""); print $0*100}'`
if [ -f /proc/cpuinfo ]; then
cores=`grep -ic '^processor' /proc/cpuinfo`
else
cores=`psrinfo | grep -c .`
# With regards to CMT system throughput, put a p=1/2 factor
case `uname -i` in
SUNW,*T[125][0-9][0-9]*) cores=`expr $cores / 2`
;;
esac
fi
printf "%-10s %d %%\n" "#cpu:" `expr $load / $cores`
disk=`PATH=/usr/ucb:$PATH df /tmp /var/tmp | awk '{sub("%$","",$5)} $5+0>max {max=$5} END {print max+0}'`
printf "%-10s %d %%\n" "#disk:" $disk
#assume 8 users per core maximum:
users | awk 's[$1]++==0 {++users} END {
printf "%-10s %-3d , %d %%\n","#users:",users,users*100/8/cores
}' RS=" " cores=$cores
#assume 24000 processes maximum (Solaris default pidmax=30000) and 30000 threads maximum (Linux default pid_max=32768)
ps -Le -o pid= |
awk 's[$1]++==0 {proc++} END {
printf "%-10s %-3d , %d %%\n","#procs:",proc,proc*100/24000
printf "%-10s %-3d , %d %%\n","#threads:",NR,NR*100/30000
}'
#assume 3000 ttys maximum
ttys=`who | grep -c .`
printf "%-10s %-3d , %d %%\n" "#ttys:" $ttys `expr $ttys \* 100 / 3000`
#all in one variable:
allprocs=`ps -e -o user= -o pcpu= -o vsz= -o rss=`
#assume 600 processes maximum:
echo "#procs per user, top 3:"
echo "$allprocs" |
awk '{s[$1]++} END {for(i in s) printf " %-9s %-3d , %d %%\n",i,s[i],int(s[i]*100/600)}' |
sort -n -k 2,2 |
tail -3
#assume 3000 threads maximum:
echo "#threads per user, top 3:"
ps -Le -o user= |
awk '{s[$1]++} END {for(i in s) printf " %-9s %-3d , %d %%\n",i,s[i],int(s[i]*100/3000)}' |
sort -n -k 2,2 |
tail -3
echo "#cpu% per user, top 3:"
scale=$cores
[ `uname -s` = SunOS ] && scale=1 # Solaris ps is already scaled!
echo "$allprocs" |
awk '{s[$1]+=$2} END {for(i in s) printf " %-9s %2.1f\n",i,s[i]/c}' c=$scale |
sort -n -k 2,2 |
tail -3
echo "#vmemoryMB per user, top 3:"
echo "$allprocs" |
awk '{s[$1]+=$3} END {for(i in s) printf " %-9s %4.1f\n",i,s[i]/1024}' |
sort -n -k 2,2 |
tail -3
echo "#residentMB per user, top 3:"
echo "$allprocs" |
awk '{s[$1]+=$4} END {for(i in s) printf " %-9s %4.1f\n",i,s[i]/1024}' |
sort -n -k 2,2 |
tail -3