Какие процессы заняли SWAP в Unix/Linux

Материал из support.qbpro.ru
Версия от 00:11, 6 апреля 2022; imported>Vix (Новая страница: «Утилиты top/htop и free отображают общее количество свободной, занятой физической памяти, а та...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Утилиты top/htop и free отображают общее количество свободной, занятой физической памяти, а так же SWAP на сервере. Как определить, какой процесс использует пространство подкачки в Unix/Linux?

Вы можете использовать любой из следующих методов (но имейте в виду, что из-за общих страниц, нет никакого надежного способа получить данную информацию):

Используйте «/proc/meminfo» – Утилита, которая покажет общие сведения об RAM/SWAP. Данная статистика используется с утилитой «free», чтобы сообщить количество свободной и используемой памяти (как физической, так и swap) в системе, а также общей памяти и буферов используемых ядром. Вы также можете использовать free, vmstat и другие инструменты чтобы узнать ту же информацию. «/proc/${PID}/smaps», «/proc/${PID}/status» и «/proc/${PID}/stat» — Используя эти утилиты, чтобы найти информацию о памяти, страницах и swap-е используемых каждым процессом( зная PID процесса). Используя smem.

.. Хочу показать отличную вариацию данного скрипта ( на мой взгляд — одно из самых лучших):


  1. !/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 rm -fR "${TMP}