в моей системе Linux я получаю эту статистику сверху:
Tasks: 155 total, 1 running, 153 sleeping, 0 stopped, 1 zombie
Cpu(s): 1.5%us, 0.3%sy, 0.0%ni, 97.4%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8177180k total, 2025504k used, 6151676k free, 44176k buffers
Swap: 7999996k total, 495300k used, 7504696k free, 637612k cached
Это показывает мне, что моя система использует 495 МБ свопа. Почему это так? 6Гигов барана бесплатно. И если бы я полностью отключил своп, система тоже заработала бы.
Любое объяснение, что на самом деле показывает номер или кто меняет местами?
Даже если приложения не требуют использования вашей памяти, Linux заменяет неиспользуемые части процессов «заранее», чем это действительно необходимо, чтобы освободить эту память немедленно, когда придет время. Вы можете отрегулировать тенденцию к этому, отрегулировав vm.swappiness
(/proc/sys/vm/swappiness
) по инструкции Вот.
Что касается того, что было заменено местами, вы теоретически можете сказать по выходным данным top
(путем вычитания столбцов виртуальной и резидентной памяти или использования столбца подкачки, который делает то же самое для вас), но в моей системе используется 0 подкачки и процесс apache2 с 248m «виртуальным образом», из которых 9376k предположительно «резидентно», оставляя 239м «поменяно местами». Я не уверен, есть ли реальный способ определить, какие конкретные процессы или части процессов на самом деле находятся в файле подкачки.
Вот сценарий, показывающий своп, используемый процессом в вашей системе Linux.
Кредит оригинальному автору: Эрик Люнгстрем 27/05/2011.
Изменен мной для увеличения полезности и удобства. HTH.
#!/bin/bash
#
# Get current swap usage for running processes
# Original: Erik Ljungstrom 27/05/2011
# Modifications by ariel:
# - Sort by swap usage
# - Auto run as root if not root
# - ~2x speedup by using procfs directly instead of ps
# - include full command line in output
# - make output more concise/clearer
# - better variable names
#
# Need root to look at all processes details
case `whoami` in
'root') : ;;
*) exec sudo $0 ;;
esac
(
PROC_SWAP=0
TOTAL_SWAP=0
for DIR in `find /proc/ -maxdepth 1 -type d | grep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
CMDLINE=`cat /proc/$PID/cmdline 2>/dev/null | tr '\000' ' '`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null | awk '{ print $2 }'`
do
let PROC_SWAP=$PROC_SWAP+$SWAP
done
if [ $PROC_SWAP == 0 ]; then
# Skip processes with no swap usage
continue
fi
echo "$PROC_SWAP [$PID] $CMDLINE"
let TOTAL_SWAP=$TOTAL_SWAP+$PROC_SWAP
PROC_SWAP=0
done
echo "$TOTAL_SWAP Total Swap Used"
) | sort -n
Linux будет использовать часть вашей памяти для кэширования и буферов, даже если она не заполнена запущенными программами. Это поведение контролируется vm.swappiness
sysctl. По умолчанию установлено 60, но многие разработчики ядра считают, что на машинах с объемом памяти более 1 ГБ или на рабочих столах пользователей оно должно быть равно нулю.
Что значит swappiness? Это значение, которое ядро будет использовать, чтобы решить, насколько хорошо оно будет пересылать программы на диск перед тем, как уничтожить кеши и буферы. Это отлично подходит для серверов (особенно файловых серверов или серверов с большим количеством операций ввода-вывода) и компьютеров с низким объемом памяти, но на настольных компьютерах это чушь. Поэтому, если вы установите его в ноль, он съест все ваши кеши и буферы, прежде чем думать о замене. Или, по крайней мере, так должно было работать, как я уже сказал, единственный способ предотвратить полную замену Linux на моем ноутбуке - это отключить подкачку с помощью swapoff
.
Так:
Своп используется для страниц в памяти, к которым нечасто обращаются, даже когда у вас свободно тонны оперативной памяти, он все равно меняет местами некоторые программы. Это частично сделано для того, чтобы избежать необходимости менять местами, когда он заполнится. В противном случае у вас будет внезапный запрос на большой объем памяти, и тогда ваша ОС должна начать подкачку, прежде чем вы сможете предоставить эту память своей программе. Страницы не используются, поэтому они не должны находиться в вашей оперативной памяти, поэтому они меняются местами.
Читать остальные вашего основного результата, в частности, разница между VIRT
и RES
сообщит вам, какая часть каждого процесса в настоящее время заменена.
В Re: почему используется своп, ваша система будет выгружать любые редко используемые данные, чтобы гарантировать, что есть свободная ОЗУ для новых программ, кэширования диска и т. Д. - Для всех кровавых деталей вам придется прочитать алгоритм подкачки в исходники ядра (наверное, не стоит).
Не могли бы вы запустить:
for a in /proc/[0-9]*/stat;do cat /proc/[0-9]*/stat|cut -d\ -f 36|grep -q ^0$||echo $a|sed -r 's#/proc/(.+)/stat#\1#';done|xargs -r ps -lwwp
Это должно показать процессы, которые меняются местами.
Вы также можете использовать эту функцию bash для анализа файла / proc // stat:
get_stat(){
local MYPID=$1
local STAT_KEYS="PID COMM STATE PPID PGRP SESSION TTY_NR TPGID FLAGS MINFLT CMINFLT MAJFLT CMAJFLT UTIME STIME CUTIME CSTIME PRIORITY NICE NUM_THREADS ITREALVALUE STARTTIME VZISE RSS RSSLIM STARTCODE ENDCODE STARTSTACK KSTKESP KSTKEIP SIGNAL BLOCKED SIGIGNORE SIGCATCH WCHAN NSWAP CNSWAP EXIT_SIGNAL PROCESOR RT_PRIORITY POLICY DELAYACCT_BLKIO_TICKS GUEST_TIME CGUEST_TIME"
STAT_KEYS=$(echo $STAT_KEYS|sed -r 's#([A-Z_]+( |$))#proc_'$MYPID'_stat_\1 #g')
for VAR in $STAT_KEYS;do
local $VAR
done
read $STAT_KEYS </proc/$MYPID/stat
for VAR in $STAT_KEYS;do
echo $VAR = $(eval 'echo $'$VAR)
done
}
get_stat $1
Смотрите также: http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html