В данной заметке я покажу, как выявить процессы, которые в своей работе используют “SWAP“. “SWAP” – это специальный раздел на диске или файл, в который операционная система перемещает отдельные блоки оперативной памяти в случае, когда оперативной памяти не хватает для работы приложений.
У меня на работе активно используется система мониторинга на базе “Nagios” и вот как раз ею был зафиксирован вот такой вот “Warning“.
Чтобы проанализировать данный “Warning” на предмет того какими процессами используется нужно в системе “Cent OS 6.4” создать вот такой скрипт следующего содержания:
Ниже командой выводит размер swap в системе:
[ekzorchik@db ~]$ free -m
total used free shared buffers cached
Mem: 15949 15446 502 0 73 3040
-/+ buffers/cache: 12333 3615
Swap: 6015 5233 782
, но что делать дальше.
Создаем скрипт:
[ekzorchik@db2 ~]$ nano swap
#!/bin/bash
SCRIPT_NAME=`basename $0`;
SORT="kb"; # {pid|kB|name} as first parameter, [default: kb]
[ "$1" != "" ] && { SORT="$1"; }
[ ! -x `which mktemp` ] && { echo "ERROR: mktemp is not available!"; exit; }
MKTEMP=`which mktemp`;
TMP=`${MKTEMP} -d`;
[ ! -d "${TMP}" ] && { echo "ERROR: unable to create temp dir!"; exit; }
>${TMP}/${SCRIPT_NAME}.pid;
>${TMP}/${SCRIPT_NAME}.kb;
>${TMP}/${SCRIPT_NAME}.name;
SUM=0;
OVERALL=0;
echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/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
if (( $SUM > 0 ));
then
echo -n ".";
echo -e "${PID}\t${SUM}\t${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.pid;
echo -e "${SUM}\t${PID}\t${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.kb;
echo -e "${PROGNAME}\t${SUM}\t${PID}" >> ${TMP}/${SCRIPT_NAME}.name;
fi
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;
echo;
echo "Overall swap used: ${OVERALL} kB";
echo "========================================";
case "${SORT}" in
name )
echo -e "name\tkB\tpid";
echo "========================================";
cat ${TMP}/${SCRIPT_NAME}.name|sort -r;
;;
kb )
echo -e "kB\tpid\tname";
echo "========================================";
cat ${TMP}/${SCRIPT_NAME}.kb|sort -rh;
;;
pid | * )
echo -e "pid\tkB\tname";
echo "========================================";
cat ${TMP}/${SCRIPT_NAME}.pid|sort -rh;
;;
esac
Делаем его исполняемым:
[ekzorchik@db2 ~]$ chmod +x swap
Запускаем:
[ekzorchik@db2 ~]$ sudo ./swap
…………………………..
Overall swap used: 5380916 kB
========================================
kB pid name
========================================
5298252 1625 mongod – Имя процесса и его PID (идентификатор) который активно использует swap
67200 1921 mysqld
2572 1643 memcached
2192 16705 memcached
1988 2065 osad
796 2036 qmgr
764 2027 master
720 2092 monit
656 919 udevd
648 602 udevd
644 2111 udevd
580 1661 sshd
536 1951 nrpe
476 2073 crond
424 1565 hald
404 1157 vmtoolsd
348 1425 rsyslogd
268 1717 mysqld_safe
204 1566 hald-runner
168 1594 hald-addon-inpu
160 1610 hald-addon-acpi
144 1409 auditd
128 1 init
124 1536 dbus-daemon
76 2116 mingetty
76 2114 mingetty
76 2109 mingetty
76 2107 mingetty
72 2112 mingetty
72 2105 mingetty
40 1444 mdadm
32 2083 rhnsd
Данным скриптом наглядно выводиться процесс который активничает со “SWAP“, что делать дальше, нужно уже анализировать его работу, проверить настроечные конфигурационные файлы и, конечно же уточнить у ответственного за данный процесс какой вид работы сейчас используется. Цель заметки достигнута, на этом всё и удачи, с уважением ekzorchik.