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 / 571043
Accepted
Rick
Rick
Asked: 2020-03-04 23:09:59 +0800 CST2020-03-04 23:09:59 +0800 CST 2020-03-04 23:09:59 +0800 CST

O que é reserva de swap preguiçosa?

  • 772

Estou lendo a Interface de programação do Linux .

49.9 MAP_NORESERVE e superalocação de espaço de swap

Alguns aplicativos criam mapeamentos grandes (geralmente anônimos privados), mas usam apenas uma pequena parte da região mapeada. Por exemplo, certos tipos de aplicativos científicos alocam um array muito grande, mas operam em apenas alguns elementos amplamente separados do array (um chamado array esparso).

Se o kernel sempre alocasse (ou reservasse) espaço de troca suficiente para todos esses mapeamentos, muito espaço de troca seria potencialmente desperdiçado. Em vez disso, o kernel pode reservar espaço de troca para as páginas de um mapeamento apenas quando elas forem realmente necessárias (ou seja, quando o aplicativo acessar uma página). Essa abordagem é chamada de reserva de troca lenta e tem a vantagem de que a memória virtual total usada pelos aplicativos pode exceder o tamanho total da RAM mais o espaço de troca.

Para colocar as coisas de outra forma, a reserva de troca lenta permite que o espaço de troca seja supercomprometido. Isso funciona bem, desde que todos os processos não tentem acessar todo o intervalo de seus mapeamentos. ...

Tanto quanto sei, o espaço de troca é um pedaço de espaço em disco, reservado para troca de memória. Quando essas páginas na memória estão inativas, elas são trocadas no espaço de troca no disco. É como um cache de segundo nível para memória/ram.

Então, o que diabos é esse mecanismo de reserva de swap preguiçoso ?

Deixe-me demonstrar minha confusão com um exemplo.

  1. Alguns aplicativos criam mapeamentos grandes (geralmente anônimos privados)....

Ok, então suponha que eu tenha mallocum grande array de 16384(4096*4)bytes (crie mapeamentos grandes (geralmente anônimos privados)) e opere apenas alguns elementos amplamente separados do array.

Então algumas páginas inativas são trocadas em espaço de troca, certo? Digamos que 0-4095(4096B), 8192-12287(4096B)estejam na memória e todas as outras páginas inativas, 4096-8191(4096B), 12288-16383(4096B)sejam trocadas no espaço de troca.

Então o que significa dizer:

Em vez disso, o kernel pode reservar espaço de troca para as páginas de um mapeamento apenas quando elas forem realmente necessárias (ou seja, quando o aplicativo acessar uma página).

Onde mais essas páginas inativas ( 4096-8191(4096B)e 12288-16383(4096B)) podem ficar, se não ficarem no espaço de troca ? O texto parece indicar que existe um cache de 3º nível para o espaço de troca.

memory -> swap space (disk) -> ????

swap mmap
  • 2 2 respostas
  • 589 Views

2 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2020-03-05T01:13:04+08:002020-03-05T01:13:04+08:00

    Swap não é realmente um cache de segundo nível para memória; é um dos vários armazenamentos de apoio para memória . Quando o kernel precisa alocar uma página de memória física, mas não tem memória livre suficiente, ele precisa despejar outra página; ele só pode fazer isso se o conteúdo da página removida for descartável ou puder ser restaurado de outro lugar. Isso em algum outro lugar está fazendo backup: pode ser um arquivo no disco ( por exemplo , para executáveis ​​ou arquivos mapeados) ou alguma área de troca.

    A reserva de swap entra em ação quando a contabilização da memória acompanha o overcommitting (consulte a tabela 49-4 em LPI ). Quando overcommitting não é permitido, o kernel precisa determinar, no momento da alocação, se uma alocação é possível. Para mapeamentos graváveis ​​privados e mapeamentos anônimos compartilhados, isso significa que ele deve ter espaço de endereço suficiente e espaço suficiente na troca (para que o kernel possa garantir que o conteúdo da memória mapeada possa ser escrito lá, garantindo assim que as gravações no memória mapeada nunca causará SIGSEGV).

    A reserva de swap preguiçosa é necessária para overcommit: significa que o kernel pode alocar um mapa de memória baseado em swap sem reservar o espaço de swap correspondente. Conforme mencionado no LPI , isso permite que os programas aloquem muito mais memória do que está realmente disponível e deve ser solicitado usando MAP_NORESERVE. A reserva só acontece quando uma página é gravada, o que significa que as gravações podem falhar SIGSEGVou resultar na intervenção do assassino OOM.

    Isso se torna significativo para alocações muito maiores do que seu exemplo de 16 KiB. Imagine que você queira um array esparso de 64GiB, 262.144×262.144, para tornar seu programa mais fácil de escrever: com reserva estrita, você precisaria ter toda essa memória disponível; sem reservas estritas, você não, e apenas as páginas para as quais você escreve serão realmente alocadas.

    Observe que tudo isso é específico do Linux e fortemente vinculado à política de overcommit do sistema escolhido ( /proc/sys/vm/overcommit_memory): nos modos 1 (sempre overcommit) e 2 (nunca overcommit), MAP_NORESERVEnão muda nada, só tem efeito no modo 0.

    • 3
  2. user373503
    2020-03-05T02:11:13+08:002020-03-05T02:11:13+08:00

    espaço de troca é um pedaço de espaço em disco

    Um pedaço de que tipo de espaço? Memória virtual.

    É fácil para o kernel dar a cada processo a quantidade de memória virtual que desejar. Essa é a parte preguiçosa e exagerada. O exemplo da matriz científica esparsa quer mostrar que muitas vezes é uma boa ideia ser preguiçoso. O array inteiro não será usado de uma vez, então outros programas podem ser executados ao mesmo tempo.

    É como um cache de segundo nível para memória/ram.

    Mas não é realmente mais rápido que "o" disco, na maioria das vezes (sem um dispositivo de troca dedicado)

    É o contrário, especialmente com overcommitting:

    A troca transforma a RAM (física) em um cache para o(s) dispositivo(s) de armazenamento.

    (ou seja, RAM não é algo para se ter e manter para um processo, mas é a área de trabalho para as páginas ativas de cada processo, incluindo arquivos mapeados).


    Aqui trata-se de sobrecarregar também o espaço de troca, não apenas a RAM. Com ou sem swap, pode levar a uma situação de OOM após o overcommiting.

    • 1

relate perguntas

  • Por que o Linux precisa de espaço de troca em uma VM?

  • A partição swap é necessária quando a partição raiz e a RAM são grandes o suficiente? [duplicado]

  • As partições swap do Linux suportam o corte?

  • Instale os arquivos de troca em vez da partição de troca manualmente no Arch Linux

  • Evite a inversão zram LRU com zswap e max_pool_percent = 100

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