AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 524846
Accepted
S.Goswami
S.Goswami
Asked: 2019-06-14 23:25:45 +0800 CST2019-06-14 23:25:45 +0800 CST 2019-06-14 23:25:45 +0800 CST

Por que meu sistema usa mais RAM após uma hora de uso?

  • 772

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.

Aqui está uma captura de tela 1 Aqui está uma captura de tela 2

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/meminfocomando 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?

performance ram
  • 2 2 respostas
  • 9657 Views

2 respostas

  • Voted
  1. Best Answer
    thecarpy
    2019-06-15T00:35:44+08:002019-06-15T00:35:44+08:00

    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:

    # sync; echo 1 > /proc/sys/vm/drop_caches
    

    Limpar dentries e inodes:

    # sync; echo 2 > /proc/sys/vm/drop_caches
    

    Limpe PageCache, dentries e inodes:

    # sync; echo 3 > /proc/sys/vm/drop_caches
    

    Observe que syncliberará o buffer do sistema de arquivos para garantir que todos os dados tenham sido gravados.

    Dos documentos do kernel :

    Cache de página

    A memória física é volátil e o caso comum para obter dados na memória é lê-los a partir de arquivos. Sempre que um arquivo é lido, os dados são colocados no cache da página para evitar acesso caro ao disco nas leituras subsequentes. Da mesma forma, quando alguém grava em um arquivo, os dados são colocados no cache da página e, eventualmente, entram no dispositivo de armazenamento de apoio. As páginas escritas são marcadas como sujas e quando o Linux decide reutilizá-las para outros fins, ele garante sincronizar o conteúdo do arquivo no dispositivo com os dados atualizados.

    Recuperar

    Ao longo do tempo de vida do sistema, uma página física pode ser usada para armazenar diferentes tipos de dados. Podem ser estruturas de dados internas do kernel, buffers compatíveis com DMA para uso de drivers de dispositivo, dados lidos de um sistema de arquivos, memória alocada por processos de espaço do usuário etc.

    Dependendo do uso da página, ela é tratada de forma diferente pelo gerenciamento de memória do Linux. As páginas que podem ser liberadas a qualquer momento, seja porque armazenam em cache os dados disponíveis em outro lugar, por exemplo, em um disco rígido, ou porque podem ser trocadas novamente para o disco rígido, são chamadas de recuperáveis. As categorias mais notáveis ​​das páginas recuperáveis ​​são cache de página e memória anônima.

    Na maioria dos casos, as páginas que contêm dados internos do kernel e usadas como buffers de DMA não podem ser reaproveitadas e permanecem fixadas até serem liberadas pelo usuário. Essas páginas são chamadas de irrecuperáveis. No entanto, em certas circunstâncias, até mesmo as páginas ocupadas com estruturas de dados do kernel podem ser recuperadas. Por exemplo, caches na memória de metadados do sistema de arquivos podem ser relidos do dispositivo de armazenamento e, portanto, é possível descartá-los da memória principal quando o sistema está sob pressão de memória.

    O processo de liberar as páginas de memória física recuperáveis ​​e reaproveitá-las é chamado (surpresa!) de recuperação. O Linux pode recuperar páginas de forma assíncrona ou síncrona, dependendo do estado do sistema. Quando o sistema não está carregado, a maior parte da memória está livre e as solicitações de alocação serão atendidas imediatamente a partir do fornecimento de páginas livres. À medida que a carga aumenta, a quantidade de páginas gratuitas diminui e quando atinge um determinado limite (marca d'água alta), uma solicitação de alocação despertará o daemon kswapd. Ele irá escanear as páginas de memória de forma assíncrona e apenas liberá-las se os dados que elas contêm estiverem disponíveis em outro lugar, ou despejar para o dispositivo de armazenamento de apoio (lembra daquelas páginas sujas?). À medida que o uso de memória aumenta ainda mais e atinge outro limite - marca d'água mínima - uma alocação acionará a recuperação direta. Nesse caso, a alocação é interrompida até que páginas de memória suficientes sejam recuperadas para satisfazer a solicitação.

    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.

    • 20
  2. sourcejedi
    2019-06-15T04:56:57+08:002019-06-15T04:56:57+08:00

    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-monitormostra apenas "Meus processos" por padrão. Para ver os processos pertencentes a todos os usuários do sistema, incluindo o rootusuá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".


    1. RAM do sistema usada versus disponível, como um único número
    2. Analisando /proc/meminfo
    3. Outras ferramentas que você pode usar - instale atophoje 8-)

    1. RAM do sistema usada versus disponível, como um único número

    Eu vejo seu código ruby ​​subtrair MemAvailablede MemTotal. Este é exatamente o mesmo cálculo usado por gnome-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-monitorou seu cálculo manual, pelo menos como uma primeira aproximação. O MemAvailablenúmero inclui basicamente todo o "cache" recuperável. Ou seja MemAvailable, 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 Cachenúmero / "cache", geralmente é relatado como incluindo Shmem/ "compartilhado". A Shmemparte 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 freecomando 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, em man free. Alguns dos outros campos podem ser enganosos:

    • O campo "usado" no freecomando (atualmente) não inclui "compartilhado". Isso pode ser muito confuso. Ignore o campo "usado" .
    • O valor "em cache" mostrado por freesofre do problema observado acima.
    • Se freenã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 como MemAvailableé 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ê tem AnonPages: 924844 kB(0,9 GB). AnonPagesé um dos termos que reduzMemAvailable .

    Quando AnonPagesestá 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 smemcomando 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. A tailparte 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 como rootusuá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 -mnã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 mencionei Shmem/ "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, ).

    Shmeminclui arquivos em tmpfs. Você pode verificar tudo montado tmpfsusando df -t tmpfs.

    Dependendo do seu sistema, Shmempode 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 Shmemvazamentos 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 livre

    Outro 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).

    Você também pode executar slabtop para ver a lista de lajes. AFAICT, slabtop não fornece estatísticas sobre lajes como recuperáveis ​​ou não recuperáveis. Mas geralmente posso adivinhar, e se houver alguma placa suspeita, acho que você pode procurá-la pelo nome.

    3. Outras ferramentas que você pode usar - instale atophoje 8-)

    smempode ser exagero. Às vezes, tudo que você precisa é top, ou sua alternativa favorita, e saber como classificar por memória residente. (Embora gnome-system-monitorpossa 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 -Rmostra "PSIZE" (mesmo significado de "PSS"). O atoppacote inclui um serviço em segundo plano que é executado em um intervalo de dez minutos. Você pode usar atop -r ...para abrir os arquivos de log, que são armazenados em /var/log/atop/.

    • 2

relate perguntas

  • Como converter cada GB de RAM do "fabricante" para os usos equivalentes EXATOS do gparted?

  • Por que `sync + drop_caches` não está descartando caches?

  • Por que `strace` não mostra que este processo está esperando por algo?

  • Tempo de criação do processo, shell script e overhead de chamada do sistema

  • O ZFS é mais seguro com RAM não ECC se você desativar as somas de verificação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve