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 / 690457
Accepted
Atemu
Atemu
Asked: 2022-02-14 00:58:48 +0800 CST2022-02-14 00:58:48 +0800 CST 2022-02-14 00:58:48 +0800 CST

A troca nas páginas de apoio gratuitas do zram quando as páginas não são trocadas?

  • 772

Imagine um cenário em que 2GiB é trocado por zram e compactado para 1GiB.

Uma vez que a pressão da memória é aliviada e os 2GiB gradualmente não são trocados, o Linux libera o 1GiB de páginas que foram usadas para armazenar as páginas zram compactadas?

Em caso afirmativo, ele desfragmenta as páginas existentes?
Deve haver várias páginas em uma página compactada, o que acontece quando todas, exceto uma, não são trocadas? Todas as páginas permanecem na memória até que a última página seja liberada também?

linux swap
  • 3 3 respostas
  • 748 Views

3 respostas

  • Voted
  1. A.B
    2022-02-14T02:04:35+08:002022-02-14T02:04:35+08:00

    Eu diria que não por padrão, mas pode ser feito assim.

    $ lsblk --discard /dev/zram0 
    NAME  DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
    zram0        0        4K       2T         0
    

    Isso significa que zram0é um dispositivo com capacidade de descarte.

    De man swapon:

    -d,--discard[=policy]

    Habilite descartes de troca, se o dispositivo de suporte de troca suportar a operação de descarte ou corte .
    [...]
    As /etc/fstabopções de montagem discard, discard=once, ou discard=pagestambém podem ser usadas para habilitar sinalizadores de descarte.

    Basta descobrir em sua distribuição Linux específica onde o swaponcomando ou equivalente é feito e adicionar adequadamente a opção swapon --discard ou a opção mount discard neste local (ou pelo menos a =pagesvariante).

    • 4
  2. Best Answer
    ens
    2022-04-11T13:59:06+08:002022-04-11T13:59:06+08:00

    Resposta curta : Sim, as páginas de apoio do zram são liberadas automaticamente.

    Após a verificação por experiência (kernel 5.10.105), parece que o armazenamento zram não utilizado é liberado automaticamente, mesmo quando o dispositivo zram é montado sem discard.

    Resumo: O script abaixo executa um processo que aloca uma grande quantidade de memória.
    O uso do zram (verificado via zramctl) aumenta inicialmente e, em seguida, volta à linha de base após interromper o processo e despejar as páginas trocadas.

    # * I've run this on a freshly booted VM *
    
    # zram is mounted with nodiscard to exclude any effects of
    # `discard`.
    sudo grep zram /etc/fstab
    # /dev/zram0 none swap nodiscard,pri=5
    
    # We have ~6 GiB of RAM
    grep -i memtotal /proc/meminfo
    # MemTotal:        6386852 kB
    
    # Show zram usage.
    # `DATA` is the total amount of uncompressed data currently stored in zram.
    zramctl
    # NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
    # /dev/zram0 zstd          3.1G   4K   58B    4K       4 [SWAP]
    
    # Start a process that allocates 10 GiB of RAM
    stress-ng -- --vm-bytes $((10*1024**3)) --vm-keep --vm 1 &
    
    # *Wait some time for the stress test command to be swapped out*
    
    # zram usage has gone up from 4 KiB to 3.1 GiB
    zramctl
    # NAME       ALGORITHM DISKSIZE  DATA COMPR TOTAL STREAMS MOUNTPOINT
    # /dev/zram0 zstd          3.1G  3.1G  1.1G  1.2G       4 [SWAP]
    
    # Stop stress test
    kill %1
    
    # zram usage decreased from 3.1 GiB to 0.3 GiB
    zramctl
    # NAME       ALGORITHM DISKSIZE   DATA COMPR TOTAL STREAMS MOUNTPOINT
    # /dev/zram0 zstd          3.1G 336.8M 48.6M 57.6M       4 [SWAP]
    
    # Read the first byte of all memory pages of all processes.
    # This evicts all non-kernel swapped pages without using `swapoff`, which might
    # reset the zram device.
    sudo ./read_all_mem_pages.rb
    
    # Now zram usage is almost back to zero
    zramctl
    # NAME       ALGORITHM DISKSIZE  DATA COMPR TOTAL STREAMS MOUNTPOINT
    # /dev/zram0 zstd          3.1G 18.4M  3.5M  5.9M       4 [SWAP]
    

    Fonte de read_all_mem_pages.rb:

    #!/usr/bin/env ruby
    
    def access_all_pages(pid)
      name = File.basename(File.readlink("/proc/#{pid}/exe")) rescue return
      puts "#{pid} (#{name})"
      File.open("/proc/#{pid}/mem", 'r') do |mem|
        for_each_mem_page(pid) do |page_address|
          mem.seek(page_address)
          mem.read(1) rescue nil
        end
      end
    end
    
    def for_each_mem_page(pid)
      File.foreach("/proc/#{pid}/maps") do |line|
        fields = line.split
        range, dest = fields[0], fields[-1]
        next if dest == "[vsyscall]"
        start, end_ = range.split('-').map { |x| x.to_i(16) }
        address = start
        while address < end_
          yield address
          address += 4096
        end
      end
    end
    
    pids = Dir.children('/proc').grep(/^\d+$/).map(&:to_i)
    pids.each { |pid| access_all_pages(pid) }
    
    • 1
  3. Alban Browaeys
    2022-05-21T05:54:51+08:002022-05-21T05:54:51+08:00

    Acredito que a memória consumida pelo zRam nunca seja liberada. Ver

    sudo zramctl --output-all
    NAME       DISKSIZE  DATA COMPR ALGORITHM STREAMS ZERO-PAGES TOTAL MEM-LIMIT MEM-USED MIGRATED MOUNTPOINT
    /dev/zram0     5,4G 56,6M 26,5M lz4             2        697 28,2M        0B    28,2M       0B [SWAP]
    

    O que importa não é 'TOTAL' que aumenta e diminui, mas 'MEM-USED' que até onde eu testei nunca desce. (Tenho que reiniciar o zramswap.service para voltar a zero). Você só pode obter o campo 'MEM-USED' do zramctl com a opção '--output-all'.

    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

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