Detectando fonte de uso de memória em uma caixa do Linux

3

Eu tenho uma caixa Linux de brinquedo com 256MB de RAM rodando o Ubuntu 10.04.1 LTS. Aqui está a saída de free -m :

             total       used       free     shared    buffers     cached
Mem:           245        122        122          0         19         64
-/+ buffers/cache:         38        206
Swap:          511          0        511

A menos que eu esteja lendo isso errado, 122mb está sendo usado e apenas 84mb disso é cache de disco. Aqui estão todos os processos que estou executando classificados por uso de memória ( ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r ):

%MEM %CPU   RSS    VSZ COMMAND
 5.0  0.0 12648 633140 node /home/node/main/sites.js
 1.5  0.0  3884 251736 /usr/sbin/console-kit-daemon --no-daemon
 1.3  0.0  3328  77108 sshd: apeace [priv]
 0.9  0.0  2344  19624 -bash
 0.7  0.0  1776  23620 /sbin/init
 0.6  0.0  1624  77108 sshd: apeace@pts/0
 0.6  0.0  1544   9940 redis-server /etc/redis/redis.conf
 0.6  0.0  1524  25848 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 103:105
 0.5  0.0  1324 119880 rsyslogd -c4
 0.4  0.0  1084  49308 /usr/sbin/sshd
 0.4  0.0  1028  44376 /usr/sbin/exim4 -bd -q30m
 0.3  0.0   904   6876 ps -eo pmem,pcpu,rss,vsize,args
 0.3  0.0   888  21124 cron
 0.3  0.0   868  23472 dbus-daemon --system --fork
 0.2  0.0   732  19624 -bash
 0.2  0.0   628   6128 /sbin/getty -8 38400 tty1
 0.2  0.0   628  16952 upstart-udev-bridge --daemon
 0.2  0.0   564  16800 udevd --daemon
 0.2  0.0   552  16796 udevd --daemon
 0.2  0.0   548  16796 udevd --daemon
 0.0  0.0     0      0 [xenwatch]
 0.0  0.0     0      0 [xenbus]
 0.0  0.0     0      0 [sync_supers]
 0.0  0.0     0      0 [netns]
 0.0  0.0     0      0 [migration/3]
 0.0  0.0     0      0 [migration/2]
 0.0  0.0     0      0 [migration/1]
 0.0  0.0     0      0 [migration/0]
 0.0  0.0     0      0 [kthreadd]
 0.0  0.0     0      0 [kswapd0]
 0.0  0.0     0      0 [kstriped]
 0.0  0.0     0      0 [ksoftirqd/3]
 0.0  0.0     0      0 [ksoftirqd/2]
 0.0  0.0     0      0 [ksoftirqd/1]
 0.0  0.0     0      0 [ksoftirqd/0]
 0.0  0.0     0      0 [ksnapd]
 0.0  0.0     0      0 [kseriod]
 0.0  0.0     0      0 [kjournald]
 0.0  0.0     0      0 [khvcd]
 0.0  0.0     0      0 [khelper]
 0.0  0.0     0      0 [kblockd/3]
 0.0  0.0     0      0 [kblockd/2]
 0.0  0.0     0      0 [kblockd/1]
 0.0  0.0     0      0 [kblockd/0]
 0.0  0.0     0      0 [flush-202:1]
 0.0  0.0     0      0 [events/3]
 0.0  0.0     0      0 [events/2]
 0.0  0.0     0      0 [events/1]
 0.0  0.0     0      0 [events/0]
 0.0  0.0     0      0 [crypto/3]
 0.0  0.0     0      0 [crypto/2]
 0.0  0.0     0      0 [crypto/1]
 0.0  0.0     0      0 [crypto/0]
 0.0  0.0     0      0 [cpuset]
 0.0  0.0     0      0 [bdi-default]
 0.0  0.0     0      0 [async/mgr]
 0.0  0.0     0      0 [aio/3]
 0.0  0.0     0      0 [aio/2]
 0.0  0.0     0      0 [aio/1]
 0.0  0.0     0      0 [aio/0]

Agora, sei que ps não é o melhor para visualizar o uso de memória do processo, mas é porque ele tende a reportar mais memória do que está sendo usado ... ou seja, não importa como você Olhe para ele, todos os meus processos combinados não devem estar usando perto de 122mb, mesmo se você considerar o cache de disco.

Além disso, o uso da memória está crescendo o tempo todo. Eu tive que reiniciar meu servidor uma vez por semana, porque uma vez que meu 256mb enche, ele inicia a troca, o que não faria apenas pelo cache de disco. Não deveria haver alguma maneira de eu ver o culpado?!

Sou novo no administrador de servidores, por isso, se houver algo óbvio, estou ignorando isso para mim.

Apenas para uma boa medida, a saída de cat /proc/meminfo :

MemTotal:         251140 kB
MemFree:          124604 kB
Buffers:           20536 kB
Cached:            66136 kB
SwapCached:            0 kB
Active:            65004 kB
Inactive:          37576 kB
Active(anon):      15932 kB
Inactive(anon):      164 kB
Active(file):      49072 kB
Inactive(file):    37412 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        524284 kB
SwapFree:         524284 kB
Dirty:                 8 kB
Writeback:             0 kB
AnonPages:         15916 kB
Mapped:            10668 kB
Shmem:               188 kB
Slab:              18604 kB
SReclaimable:      10088 kB
SUnreclaim:         8516 kB
KernelStack:         536 kB
PageTables:         1444 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      649852 kB
Committed_AS:      64224 kB
VmallocTotal:   34359738367 kB
VmallocUsed:         752 kB
VmallocChunk:   34359737600 kB
DirectMap4k:      262144 kB
DirectMap2M:           0 kB

EDIT: Eu tinha interpretado erroneamente o significado de free -m no começo. Mas mesmo assim: o importante é que meu sistema operacional eventualmente comece a usar memória swap se eu não reiniciar meu servidor, o que o cache de disco não faria. Então, onde eu olho para ver o que está usando toda essa memória?

    
por apeace 09.01.2011 / 21:08

3 respostas

3

Como todos já explicaram, nada está usando muita memória RAM agora. Tente executar o comando ps quando estiver enfrentando problemas.

O mais provável é que o Node.js, o Redis ou algum outro serviço não esteja muito bem configurado e use mais memória RAM ao longo do tempo, pois você obtém mais tráfego ou repentinamente usa muita RAM quando obtém o Slashdotted. Mas é impossível dizer o que exatamente vai dar errado depois quando nada está errado agora .

    
por 10.01.2011 / 09:02
2

O problema real é a necessidade de reinicializar por causa do grande swapfile, certo?

Até onde eu sei, quando o kernel está ficando sem memória, ele tem duas opções:

  1. Troque
  2. Coma um pouco do 'cache' (o que é claro que foi acumulado na esperança de que os dados em cache sejam solicitados novamente)

Já tentou influenciar esta escolha ao jogar com swappiness ?

Configurá-lo para algo baixo (20?) pode ajudá-lo a melhorar as coisas. O padrão é 60 (que tende a uma preferência para trocar).

Então, você é um administrador e eu sou um usuário comum e talvez você já tenha tentado.

    
por 10.01.2011 / 02:30
1

Está tudo bem, veja menos espaço livre para memória, como parte deles são usados para buffer / cache. Sua troca tem todo o espaço livre. Então, espero que você ainda não tenha nenhum impacto de falta de memória.

De buffers / saída de cache, o 206M é gratuito para aplicativos.

Você também pode obter uma aproximação de

cat /proc/[process id]/maps

(ou)

pmap [process id]

pmap -x [process id]

    
por 10.01.2011 / 07:04