Get the memory and cpu usage

what is the best way to get the memory and cpu usage of a process on any system?

this is relatively simple. however, i'm looking for a unified method that would work on linux, sunos, hpux, aix.

ps -ef | egrep myprocess | awk '{print $4}' ---> there could be several instances of 'myprocess' running. so this command would have to add up the usage of all of them.

any ideas?

the ideal command would output something like this:

myprocess(17),cpu-usage(60%),memory-usage(40%)
ps -ae -o user,pid,ppid,project,zone,class,pri,lwp,psr,pset,pmem,etime,time,tty,args

should give you the process wide cpu/memory utilization, however if you are going to take this from within the system or kernel statistical data it comes primarily from different methods.

you can better opt for top command.
Eg: top or top | grep user/process_name

For regular system monitoring I recommend to install "Xymon".
I use the following script to get a quick overview of the system, works on Linux and Solaris:

#!/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,int(s*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,int(s*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/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/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/1024}' |
 sort -n -k 2,2 |
 tail -3
1 Like