A question asked to me often, “Which processes are using up too much memory?” I generally use top to figure them out manually. But there’s a better way to do it, using Solaris pmap command. I can get a good estimate on the memory usage. Brandon Hutchinson has a shell script that provides a nice output. I modified it a little bit to include a column for process owner.
#!/bin/sh
/usr/bin/printf "%-6s %-9s %-13s %s\n" "PID" "Total" "User" "Command"
/usr/bin/printf "%-6s %-9s %-13s %s\n" "---" "-----" "----" "-------"
for PID in `/usr/bin/ps -ef | /usr/bin/awk '$2 ~ /[0-9]+/ { print $2 }'`
do
USER=`/usr/bin/ps -o user -p $PID | /usr/bin/tail -1`
CMD=`/usr/bin/ps -o comm -p $PID | /usr/bin/tail -1`
# Avoid "pmap: cannot examine 0: system process"-type errors
# by redirecting STDERR to /dev/null
TOTAL=`/usr/bin/pmap $PID 2>/dev/null | /usr/bin/tail -1 | \
/usr/bin/awk '{ print $2 }'`
[ -n "$TOTAL" ] && /usr/bin/printf "%-6s %-9s %-13s %s\n" "$PID" "$TOTAL" "$USER" "$CMD"
done | /usr/bin/sort -rn -k2
Note, this script needs to run as “root” for pmap to have permission to examine each process.
Output looks something like this:
PID Total User Command
--- ----- ---- -------
694 25240K root /opt/RICHPse/bin/se.sparcv9.5.9
696 5208K root /usr/dt/bin/dtlogin
613 4992K root /opt/CA/BABcmagt/caagentd
326 4512K smmsp /usr/lib/sendmail
260 4440K root /usr/sbin/syslogd
269 2440K root /usr/sbin/cron
196 2360K root /usr/sbin/keyserv
193 2352K root /usr/sbin/rpcbind
103 2336K root /usr/lib/sysevent/syseventd
235 2224K root /usr/lib/nfs/lockd
206 2184K root /usr/lib/netsvc/yp/ypbind