How can I know which process is using swap?

There is lots of memory avaiable(about 4G) but swap is used(200+M) in my fedora box.

I wonder which process is using swap. How can I know it.

ps and top only show the memory usage.

Thanks in advance.

Answers


From here:

[a] /proc/meminfo - This file reports statistics about memory usage on the system. It is used by free to report the amount of free and used memory (both physical and swap) on the system as well as the shared memory and buffers used by the kernel. You can also use free, vmstat and other tools to find out the same information.

[b] /proc/${PID}/smaps, /proc/${PID}/status, and /proc/${PID}/stat : Use these files to find information about memory, pages and swap used by each process using its PID.

[c] smem - This command (python script) reports memory usage with shared memory divided proportionally.

Also you can refer Find out what is using your swap

#!/bin/bash
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
SUM=0

done
echo "Overall swap used: $OVERALL"

Improving the cyberciti.biz command to show a more concise answer:

(echo "COMM PID SWAP"; for file in /proc/*/status ; do awk '/^Pid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | grep -wv "0 kB" | sort -k 3 -n -r) | column -t

An example output:

COMM             PID    SWAP  
dockerd          662    2736  kB
skypeforlinux    26865  1320  kB
NetworkManager   303    1112  kB
slim             392    1028  kB
redis-server     350    204   kB

On the /proc/'processPID'/status you can find that information on the field VmSwap.

With this command you can list all process that are using swap.

for file in /proc/*/status ; 
do 
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; 
done

Reference: http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/


My take on using awk to output a nice table sorted by swap usage:

  awk 'function pr(){if (s ~ /^[1-9]/) print p,n,s;n="";p="";s=""}BEGIN{FS="\t *";OFS="\t"}/^Name:/{pr();n=$2}/^VmSwap:/{s=$2}/^Pid:/{p=$2}END{pr()}' /proc/*/status | sort -t $'\t' -k3 -n -r | column -t -s $'\t'

Sample Output:

  33992  httpd        13916 kB
  9331   httpd        10616 kB
  43124  httpd        1800 kB
  31353  httpd        592 kB
  8592   master       184 kB
  8606   crond        44 kB
  8653   mingetty     40 kB
  8655   mingetty     32 kB

Based onadrianlzt answer.


Need Your Help

How can I include null values in a MIN or MAX?

sql sql-server tsql

I have a table where I am storing timespan data. the table has a schema similar to:

Linux flock, how to "just" lock a file?

linux file-locking flock filelock

In Bash, I'm trying to make a function getLock to be used with different lock names.