Назад | Перейти на главную страницу

Что и почему мое пространство подкачки используется под Linux

в моей системе 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.

Так:

  • Серверы: swappiness 60 или больше
  • Настольные компьютеры с большой памятью: swappiness <60, 0 или вообще без свопа, ваш пробег может отличаться, следите за сообщениями oom_killer (это означает, что у вас закончилась память и ядро ​​что-то убило)
  • Настольные компьютеры с низким объемом памяти: swappiness 60 и swap space = физическая память, вероятно, будет лучшей

Своп используется для страниц в памяти, к которым нечасто обращаются, даже когда у вас свободно тонны оперативной памяти, он все равно меняет местами некоторые программы. Это частично сделано для того, чтобы избежать необходимости менять местами, когда он заполнится. В противном случае у вас будет внезапный запрос на большой объем памяти, и тогда ваша ОС должна начать подкачку, прежде чем вы сможете предоставить эту память своей программе. Страницы не используются, поэтому они не должны находиться в вашей оперативной памяти, поэтому они меняются местами.

Читать остальные вашего основного результата, в частности, разница между 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