
Estou executando o top e vejo que de 502.968 KB, 48.064 KB são usados, deixando 16.884 KB livres. Mas então, quando olho para os processos individuais, vejo que o mysql está consumindo 9,4% da minha RAM ocasionalmente - mas nada mais parece estar consumindo nada. O que está consumindo toda a minha RAM?
Aqui está uma captura de tela do topo:
top - 20:46:07 up 1 min, 1 user, load average: 0.18, 0.05, 0.02
Tasks: 81 total, 1 running, 80 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.4 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 502968 total, 241236 used, 261732 free, 10488 buffers
KiB Swap: 524284 total, 0 used, 524284 free, 106756 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1584 dmackey 20 0 20508 1372 1000 R 0.4 0.3 0:00.01 top
1 root 20 0 26664 2456 1340 S 0.0 0.5 0:00.69 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0
7 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0H
8 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.24 rcu_sched
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
12 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
E aqui está um grátis:
total used free shared buffers cached
Mem: 502968 355252 147716 0 10816 111548
-/+ buffers/cache: 232888 270080
Swap: 524284 0 524284
Responder1
Nada.
É Linux, e isso écomo funciona.
Ele usará memória "livre" para cache de disco, porque qual é o sentido de ter um recurso subutilizado?
Quando um processo deseja mais memória, ele a solicita ao kernel e (geralmente) a obtém.
Ah.. e o MySQL usará o quanto for necessário (conforme configurado em /etc/my.cnf
) para que índices, consultas e tabelas sejam armazenados em cache do disco, na memória para tornar os tempos de acesso mais rápidos.
Responder2
É apenas qualquer lixo que resta na memória, da forma como foi usado por último. Provavelmente, são dados que foram lidos ou gravados no disco. O sistema operacional não libera memória porque isso é um desperdício por três motivos:
Se a memória não for usada logo, liberá-la não resultará em nada.
Se a memória for usada em breve, liberá-la será apenas um trabalho que deverá ser desfeito, pois deverá ser reutilizada.
Se as informações que estavam na memória forem necessárias novamente, liberar a memória significará ter que obter essas informações do disco em vez da memória, o que é muito mais lento.
Os sistemas operacionais modernos só liberam memória se não tiverem outra escolha. Se você está pensando: “Quero essa memória livre agora para poder usá-la mais tarde”, pare. Você não precisa que a memória esteja livre agora para usá-la mais tarde. Não há nenhuma compensação aqui, é uma pura vitória manter a memória em uso até que seja necessária.
Responder3
Registrar a saída do top para análise futura é a melhor maneira de responder à sua pergunta. Não há solução rápida, será necessária alguma investigação observada ao longo do tempo. Uma coisa única que uso para percorrer a superfície do que está usando minha memória é colocar isso no crontab do root.
/bin/bash top -b -n 1 | head > `/var/log/date +%e_%T`
Então eu uso alguma manipulação de texto e pager-fu para rastrear tendências. Esta postagem de estouro de pilhahttps://stackoverflow.com/questions/7908953/how-to-measure-cpu-usagetem alguns exemplos mais abrangentes de uso de top como este e de personalização de top via .toprc
, para estatísticas de CPU, mas pode ser facilmente adaptado para atender às suas necessidades.