O que e por que meu espaço de troca é usado no linux

5

no meu sistema linux eu recebo essas estatísticas do topo:

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

Lá me mostra que meu sistema está usando 495Mb de swap. Porque isto é assim? 6Gigs de ram estão livres. E se eu desabilitar a troca por completo, o sistema também funcionaria.

Alguma explicação sobre o que o número realmente mostra ou quem está trocando?

    
por Fabian 19.08.2011 / 16:40

6 respostas

8

Mesmo que não haja demandas de aplicativos em sua memória, o Linux trocará as partes não utilizadas dos processos "antecipadamente" de fato, de modo que ele possa liberar essa memória imediatamente quando chegar a hora. Você pode ajustar a tendência de fazer isso ajustando vm.swappiness ( /proc/sys/vm/swappiness ) pelas instruções Aqui .

Quanto a ver o que é trocado, teoricamente, é possível dizer a partir da saída de top (subtraindo as colunas de memória virtual e residente ou usando a coluna de troca que faz o mesmo por você), mas meu sistema 0 swap usado e um processo apache2 com 248m "Virtual Image", dos quais 9376k é supostamente "residente", deixando 239m "trocados". Não tenho certeza se existe uma maneira real de identificar quais processos específicos ou partes dos processos estão realmente no arquivo de troca.

    
por 19.08.2011 / 17:23
7

Aqui está um script para mostrar a troca usada pelo processo em seu sistema Linux.

Crédito ao autor original: Erik Ljungstrom 27/05/2011.

Modificado por mim para aumentar a utilidade e a simpatia. 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 '
#!/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 '%pre%0' ' ''
        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
0' ' '' 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
    
por 02.09.2012 / 02:29
2

O Linux usará parte de sua memória para armazenamento em cache e buffers, mesmo que não esteja cheio de programas em execução. Esse comportamento é controlado pelo vm.swappiness sysctl. O padrão é 60, mas muitos dos desenvolvedores do kernel pensam que em máquinas com mais de 1GB de memória ou desktops de usuários, ele deve ser zero.

O que significa swappiness? É um valor que o kernel usará para decidir quão feliz será trocar programas em disco antes de destruir caches e buffers. Isso é ótimo em servidores (especialmente servidores de arquivos ou servidores com alta E / S) e computadores com pouca memória, mas é besteira nos desktops. Então, se você definir zero, ele vai comer todos os seus caches e buffers antes de pensar em trocar. Ou, pelo menos, deveria funcionar dessa maneira, já que eu disse que a única maneira de evitar que o Linux trocasse completamente no meu laptop era desligar o swap com swapoff .

Então:

  • Servidores : swappiness 60 ou mais
  • Desktops com muita memória : swappiness < 60, 0 ou nenhuma troca, sua milhagem pode variar, observe as mensagens do oom_killer (isso significa que você ficou sem memória e o kernel matou alguma coisa)
  • Áreas de trabalho com pouca memória : swappiness 60 e espaço de troca = a memória física provavelmente será a melhor
por 23.08.2011 / 20:09
0

O swap é usado para páginas na memória que não são acessadas com freqüência, mesmo quando você tem toneladas de memória RAM, ainda troca alguns programas. Isto é parcialmente para evitar ter que trocar quando estiver cheio. Caso contrário, você teria um pedido de repente para muita memória e, em seguida, seu sistema operacional deve começar a trocar antes de poder dar essa memória para o seu programa. As páginas não estão sendo usadas, então elas não precisam estar na sua RAM, então elas são trocadas.

    
por 19.08.2011 / 16:47
0

Leia o restante da sua saída principal, especificamente a diferença entre VIRT e RES informará quanto de cada processo está atualmente sendo trocado.

No Re: por que swap está sendo usado, seu sistema irá mostrar os dados acessados com pouca frequência para garantir que há RAM livre para novos programas, cache de disco, etc. - Para todos os detalhes, você teria que ler o swap. algoritmo na fonte do kernel (provavelmente não vale a pena).

    
por 19.08.2011 / 16:52
0

Você pode por favor executar:

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##';done|xargs -r ps -lwwp

Isso deve mostrar os processos que estão trocando.

Você também pode usar essa função bash para analisar o arquivo / 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_ #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

Veja também: link

    
por 23.08.2011 / 19:58

Tags