Skip to content

Linux: Find Top 10 processes utilizing swap.

Updated: Corrected grep syntax problem.

Hello.

Nothing much to do today other than completing some pending documentations for my junior analysts, so I’ve decided to write a helper script to kill some time.

This bash script will display top ten processes which utilizing swap filesystem. It could be very useful if you want to troubleshoot any swap related issue.  I have tested it on Oracle Enterprise Linux and it should be working fine on any Redhat based distribution.

#!/bin/bash
# GSS Linux: Script to find Top 20 processes utilizing swap filesystem.
# Author: Azwan_Ngali (azwan.ngali[AT]gmail.com)
# Linux blusmurf 2.6.32-042stab081.3 #1 SMP Mon Sep 9 20:07:47 MSK 2013 i686

SWAPFREE=$(cat /proc/meminfo | grep SwapFree: | awk -F " " '{print $2}')
SWAPTOTAL=$(cat /proc/meminfo | grep SwapTotal: | awk -F " " '{print $2}')
SWAPUSAGE=$(echo "$SWAPTOTAL - $SWAPFREE" | bc)
SWAPPERCENTAGE=$(echo "scale=3;($SWAPUSAGE / $SWAPTOTAL) * 100" | bc)
COUNTER=0

printf "\n"
printf "Displaying Top 20 processes which utilization swap filesystem  \n"


printf "Current swap utilization (kB): $SWAPFREE / $SWAPTOTAL ($SWAPPERCENTAGE%%)\n"
printf "\n"

printf "%-25s %-25s %-25s\n" "PID" "Swap Utilization (kB)" "Process Name"
printf "%1s\n" "------------------------------------------------------------------------------------------------------------------------"

# Send ps ax output to temporary text file.

ps ax | awk '{print $1 " " $5}' > /tmp/psax_temp.txt

for x in $(grep Swap /proc/[1-9]*/smaps | grep -v '\W0 kB' | tr -s ' ' | cut -d' ' -f-2 | sort -t' ' -k2 -n | tr -d ' ' | tail -20); do

        SWAPUSAGE=$(echo $x | cut -d: -f3)
        PID=$(echo $x | cut -d/ -f3)
        PROCNAME=$(grep -w $PID /tmp/psax_temp.txt | awk '{print $2}')
        printf "%-25s %-25s %-25s\n" $PID $SWAPUSAGE $PROCNAME
        COUNTER=$((COUNTER+1))

done

# No process found.

if [ $COUNTER -eq 0]; then

printf "No process found\n"

fi

# Remove temp file.

rm -f /tmp/psax_temp.txt

Note 1: Processes may appear multiple times if they have multiple memory regions swapped (and these are large)

Note 2: If the above script produces no output, then it could be that none of the currently running processes in /proc/*/smaps are using swap.

You can test that by simply running:

 grep Swap /proc/[1-9]*/smaps | grep -v '\W0 kB'

Important thing to keep in mind is that the aforementioned script will only show the active processes that have memory swapped at that point in time, meaning at the time when the script was run. It might be quite possible that the system has already swapped a chunk of memory and that is visible on free output but the script shows no output. Point being, this script shows the current swapping activity and cannot be used for historical data gathering. For that purpose, sar can be used.

Output example

[root@oracle healthcheck]# ./swap.sh

Displaying Top 20 processes which utilization swap filesystem
Current swap utilization (kB): 7247736 / 16778232 (56.800%)

PID                       Swap Utilization (kB)     Process Name
------------------------------------------------------------------------------------------------------------------------
22640                     15420                     /stornext/snfs1/eradmin/ggs/misc_oc10.2_11gV4/replicat
22440                     15528                     /stornext/snfs1/eradmin/ggs/misc_oc11.1_11gV4/extract
31065                     16208                     /stornext/snfs1/eradmin/ggs/siebeldwngrd_oc11.2_11gV4/replicat
3004                      17372                     /stornext/snfs1/eradmin/ggs/misc_oc10.2_11gV4/extract
17756                     17560                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_2/replicat
4453                      18148                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_1/replicat
668                       19436                     /stornext/snfs1/eradmin/ggs/misc_oc10.2_11gV4/extract
4454                      22516                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_1/replicat
9052                      23292                     /opt/dell/srvadmin/sbin/dsm_sa_datamgrd
4450                      28996                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_1/replicat
4460                      33824                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_1/replicat
17754                     38468                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_2/replicat
30233                     42912                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_2/replicat
4449                      43308                     /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_1/replicat
9052                      63488                     /opt/dell/srvadmin/sbin/dsm_sa_datamgrd
9052                      63488                     /opt/dell/srvadmin/sbin/dsm_sa_datamgrd
9052                      65536                     /opt/dell/srvadmin/sbin/dsm_sa_datamgrd
9052                      65536                     /opt/dell/srvadmin/sbin/dsm_sa_datamgrd
9052                      65536                     /opt/dell/srvadmin/sbin/dsm_sa_datamgrd
4467                      4717844                   /stornext/snfs1/eradmin/ggs/misc_tc14.0_11gV1_1/replicat
[root@oracle healthcheck]#

Toodles.

Published inLinux

Be First to Comment

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.