Estou usando o Arch Linux (5.1.8-arch1-1-ARCH) com o XFCE DE e XFWM4 WM. As coisas são bastante elegantes e com pouco uso de RAM e CPU.
Após a inicialização, e quando o DE é carregado completamente, vejo 665 MiB de uso de RAM.
Mas depois de abrir aplicativos como Atom, Code, Firefox, Chromium, ou depois de trabalhar no GIMP, Blender etc. o uso de RAM aumenta, o que é óbvio. Mas depois de fechar todos os aplicativos e sair com nada além de um monitor do sistema gnome, posso ver que o uso de RAM é de 1,2 a 1,4 GiB. /proc/meminfo concorda com o gnome-system-monitor, mas o htop dá resultados diferentes o tempo todo.
O pior é que, quando abro um aplicativo que consome RAM mais tarde, ele consome novamente a memória necessária em cima dos 1,4 GiB. Este é sempre o caso. Nenhum arquivo que pode somar megabytes é armazenado no diretório /tmp/.
Além disso, se eu procurar o processo que está usando tanta RAM (de 700 MiB no início para 1,4 GiB depois de fechar o navegador !!), não vejo nada. Na verdade, enfrentei o mesmo problema, mesmo no meu raspberry pi executando o Arch ARM.
O código Ruby:
#!/usr/bin/ruby -w
STDOUT.sync = true
loop do
IO.readlines(File.join(%w(/ proc meminfo))).then { |x| [x[0], x[2]] }.map { |x| x.split[1].to_i }.reduce(:-)
.tap { |x| print "\e[2K\rRAM Usage:".ljust(20), "#{x / 1024.0} MiB".ljust(24), "#{(x / 1000.0)} MB" }
Kernel.sleep(0.1)
end
O cat /proc/meminfo
comando tem a seguinte saída:
MemTotal: 3851796 kB
MemFree: 1135680 kB
MemAvailable: 2055708 kB
Buffers: 1048 kB
Cached: 1463960 kB
SwapCached: 284 kB
Active: 1622148 kB
Inactive: 660952 kB
Active(anon): 923580 kB
Inactive(anon): 269360 kB
Active(file): 698568 kB
Inactive(file): 391592 kB
Unevictable: 107012 kB
Mlocked: 32 kB
SwapTotal: 3978216 kB
SwapFree: 3966696 kB
Dirty: 280 kB
Writeback: 0 kB
AnonPages: 924844 kB
Mapped: 563732 kB
Shmem: 374848 kB
KReclaimable: 74972 kB
Slab: 130016 kB
SReclaimable: 74972 kB
SUnreclaim: 55044 kB
KernelStack: 8000 kB
PageTables: 14700 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 5904112 kB
Committed_AS: 3320548 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 1456 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 226736 kB
DirectMap2M: 3778560 kB
DirectMap1G: 0 kB
Em primeiro lugar, você notou que o htop nunca concorda. Eu não sei muito sobre isso.
E em segundo lugar, você pode ver que o xfdesktop usa 44 MiB e alguns outros processos usam parte da memória, o kernel usa ~ 150 MiB e, além disso, por que estou vendo que 1,5 GiB de RAM está sendo usado? Isso realmente afeta o desempenho do sistema?
RAM não utilizada é RAM desperdiçada. O kernel do Linux possui recursos avançados de gerenciamento de memória e tenta evitar sobrecarregar o gargalo do seu sistema, seu disco rígido/SSD. Ele tenta armazenar arquivos em cache na memória.
O sistema de gerenciamento de memória funciona de maneira complexa, o objetivo é melhorar o desempenho.
Você pode ver o que está fazendo inspecionando
/proc/meminfo
.cat /proc/meminfo
Você pode recuperar essa memória em cache, usando "drop_caches". No entanto, observe que a documentação diz que "o uso fora de um ambiente de teste ou depuração não é recomendado", simplesmente porque "pode custar uma quantidade significativa de E/S e CPU para recriar os objetos descartados" quando forem necessários novamente :-).
Limpar somente o PageCache:
Limpar dentries e inodes:
Limpe PageCache, dentries e inodes:
Observe que
sync
liberará o buffer do sistema de arquivos para garantir que todos os dados tenham sido gravados.Dos documentos do kernel :
Perdas de memória
Agora, alguns programas podem ter "vazamentos de memória", ou seja, eles "esquecem" de liberar memória que não usam mais. Você pode ver isso se você deixar um programa em execução por algum tempo, seu uso de memória aumenta constantemente, quando você o fecha, a memória nunca é liberada. Agora, os programadores tentam evitar vazamentos de memória, é claro, mas os programas podem ter alguns. A maneira de recuperar essa memória é uma reinicialização.
Você olhou para uma lista de processos e seu uso de memória. Mas havia um problema. Você não estava olhando a lista completa.
gnome-system-monitor
mostra apenas "Meus processos" por padrão. Para ver os processos pertencentes a todos os usuários do sistema, incluindo oroot
usuário, clique no ícone do menu no canto superior direito (três pontos em uma linha vertical). Altere a seleção de "Meus processos" para "Todos os processos".atop
hoje 8-)1. RAM do sistema usada versus disponível, como um único número
Eu vejo seu código ruby subtrair
MemAvailable
deMemTotal
. Este é exatamente o mesmo cálculo usado porgnome-system-monitor
, quando mostra que o sistema está usando "1,5 GiB (41,4%) de 3,7 GiB".Você está certo em usar um
gnome-system-monitor
ou seu cálculo manual, pelo menos como uma primeira aproximação. OMemAvailable
número inclui basicamente todo o "cache" recuperável. Ou sejaMemAvailable
, inclui um tipo de "cache" que está "disponível" para ser recuperado, assim que um programa solicita mais memória do que você tem livre.Nota lateral: Existe outro tipo ou significado de "cache", que não é recuperável. Quando você olha para o
Cache
número / "cache", geralmente é relatado como incluindoShmem
/ "compartilhado". AShmem
parte não é cache recuperável. A confusão acontece porqueShmem
foi habilmente implementado usando o kernel "cache de página".Outra maneira de verificar rapidamente "disponível" é
free -h
.O
free
comando também mostra "compartilhado", uso de troca etc. A documentação do seu sistema deve listar os campos de saída e as opções disponíveis, ou seja, emman free
. Alguns dos outros campos podem ser enganosos:free
comando (atualmente) não inclui "compartilhado". Isso pode ser muito confuso. Ignore o campo "usado" .free
sofre do problema observado acima.free
não mostrar "disponível", seu sistema é antigo. Consulte sua documentação antiga.2. Analisando /proc/meminfo
Obrigado pela saída completa de
cat /proc/meminfo
. Isso geralmente ajuda a encontrar respostas específicas (ou qualquer resposta). Se você quiser ver comoMemAvailable
é calculado, leia a primeira seção da minha resposta aqui: A memória "em cache" está livre de fato?Anon Pages
No seu exemplo
meminfo
, você temAnonPages: 924844 kB
(0,9 GB).AnonPages
é um dos termos que reduzMemAvailable
.Quando
AnonPages
está aumentando, isso deve indicar um aumento no "RES" ou "RSS" ("Resident" na memória RAM "Set Size") de alguns programas em execução. Mas o RSS pode ser enganoso, porque alguma memória é compartilhada:Você não pode adicionar RSS, porque isso contaria duas vezes a memória compartilhada. Você tem que somar o PSS , o RSS proporcional depois de contabilizar o compartilhamento. O
smem
comando pode mostrar PSS e também calcular totais. Por exemplo:sudo smem -t > p; head -n1 p; echo; tail -n17 p
- Veja o uso de memória por processo. Atail
parte mostrará os 15 principais processos, seguidos por uma linha com o total de PSS etc.smem -t -U ^sourcejedi$ > U; head -n1 U; echo; tail -n17 U
- Veja o uso de memória de processos pertencentes ao meu usuário, "sourcejedi".sudo smem -t -u
- Veja a memória agrupada por usuário. Isso pode ser útil para distinguir sua(s) sessão(ões) de login de alguns daemons do sistema que são executados como seu próprio usuário. Por exemplo, packagekitd é executado comoroot
usuário e pode usar centenas de megabytes.smem -t -P firefox
- Veja o uso de memória do meu navegador :-).sudo smem -t -m > m; head -n5 m; echo; tail m
- Observe a memória agrupada pelo nome do mapeamento - o nome do arquivo em cache, ou "<anonymous>" ou "[heap]" .A memória "residente" do processo inclui memória "anônima" e alguns arquivos em cache .
smem -m
não pode mostrar todos os arquivos em cache, apenas alguns tipos de arquivos que estão em uso no momento. Especificamente, arquivos que um programa mapeou na memória virtual. Isso inclui código de programa, código de biblioteca e arquivos mapeados usando mmap().Shmem
Você também tem
Shmem: 374848 kB
(0,4 GB). Eu mencioneiShmem
/ "compartilhado" acima. Este é outro termo que reduz a memória "disponível". (Não é cache recuperável). Isso é bastante normal, mas você pode tentar ver o que é.Alguma memória compartilhada é visível como a memória de processos individuais. Se a memória compartilhada for mapeada por um processo, ela deverá ser contabilizada no RSS/PSS. Veja acima. O "nome do mapeamento" às vezes pode ser útil aqui (por exemplo
smem -t -m
, ).Shmem
inclui arquivos emtmpfs
. Você pode verificar tudo montadotmpfs
usandodf -t tmpfs
.Dependendo do seu sistema,
Shmem
pode incluir alguns buffers gráficos. Encontrei uma maneira de verificar seu tamanho atual no meu sistema (gráficos Intel): Posso ver a quantidade de memória alocada como buffers GEM? Eu adoraria saber se você encontrar uma maneira diferente de verificar em seu sistema!Eu li que
Shmem
vazamentos de memória em algum outro driver gráfico podem estar associados a VIRT muito grande (também conhecido como VSIZE) para Xorg. Linux usando toda a troca, deixando de responder enquanto há muita RAM livreOutro uso de memória?
MemTotal - MemAvailable = 1796088 kB
(1,8 GB)AnonPages: 924844 kB
(0,9 GB)Shmem: 374848 kB
(0,4 GB)Dos 0,5 GB restantes, posso ver mais alguns pequenos usos abaixo de 0,1 GB no geral. O kernel também reserva alguns pontos percentuais de margem para si mesmo (veja "marca d'água baixa"), mas acho que seria 0,2 GB ou menos no seu sistema. Portanto, há um pouco mais de uso que não tenho certeza.
Memória de laje do kernel
Memória "laje não recuperável" é outro termo que reduz o
MemAvailable
. Você não tem muito:SUnreclaim: 55044 kB
(0,05 GB).3. Outras ferramentas que você pode usar - instale
atop
hoje 8-)smem
pode ser exagero. Às vezes, tudo que você precisa étop
, ou sua alternativa favorita, e saber como classificar por memória residente. (Emboragnome-system-monitor
possa não ser uma boa escolha para isso. Acho que não mostra o suficiente).Às vezes, quando você tem um problema de desempenho, precisa analisar as leituras e gravações do disco. Você poderia usar
sudo iotop
.Às vezes, você gostaria de ter um log de uso de memória por processo, para poder ver por que ficou sem memória e deixou o sistema lento...
atop
é uma pequena ferramenta bacana que pode fazer tudo acima. Se isso parece útil, sugiro que você o instale imediatamente. Então você pode aprender sobre isso quando precisar :-).sudo atop -R
mostra "PSIZE" (mesmo significado de "PSS"). Oatop
pacote inclui um serviço em segundo plano que é executado em um intervalo de dez minutos. Você pode usaratop -r ...
para abrir os arquivos de log, que são armazenados em /var/log/atop/.