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 / 474926
Accepted
Tim
Tim
Asked: 2018-10-12 13:42:06 +0800 CST2018-10-12 13:42:06 +0800 CST 2018-10-12 13:42:06 +0800 CST

Como o mapeamento de memória de um arquivo aumenta significativamente o desempenho em relação às chamadas de sistema de E/S padrão?

  • 772

Conceitos do sistema operacional diz

Considere uma leitura sequencial de um arquivo em disco usando as chamadas padrão do sistema open(), read() e write() . Cada acesso de arquivo requer uma chamada de sistema e acesso ao disco .

Alternativamente, podemos usar as técnicas de memória virtual discutidas até agora para tratar a E/S de arquivo como acessos de memória de rotina. Essa abordagem, conhecida como mapeamento de memória de um arquivo , permite que uma parte do espaço de endereço virtual seja logicamente associada ao arquivo. Como veremos, isso pode levar a aumentos significativos de desempenho. O mapeamento de memória de um arquivo é realizado mapeando um bloco de disco para uma página (ou páginas) na memória. O acesso inicial ao arquivo ocorre por meio de paginação de demanda comum, resultando em uma falha de paginação. No entanto, uma parte do arquivo do tamanho de uma página é lida do sistema de arquivos em uma página física (alguns sistemas podem optar por ler mais do que um pedaço de memória do tamanho de uma página de cada vez). Leituras e escritas subsequentes no arquivo são tratadas como acessos de memória de rotina. Manipular arquivos através da memória em vez de incorrer na sobrecarga de usar as chamadas de sistema read() e write() simplifica e acelera o acesso e uso de arquivos.

Você poderia analisar o desempenho do arquivo mapeado na memória?

Se eu estiver correto, o arquivo de mapeamento de memória funciona da seguinte maneira. É preciso uma chamada de sistema para criar um mapeamento de memória. Então, quando ele acessa a memória mapeada, ocorrem falhas de página. As falhas de página também têm sobrecarga.

Como o mapeamento de memória de um arquivo aumenta significativamente o desempenho em relação às chamadas de sistema de E/S padrão?

linux performance
  • 2 2 respostas
  • 21664 Views

2 respostas

  • Voted
  1. Best Answer
    sebasth
    2018-10-12T13:52:34+08:002018-10-12T13:52:34+08:00

    O mapeamento de memória de um arquivo evita diretamente a cópia de buffers que acontecem com read()e write()chamadas. Chama read()e write()inclui um ponteiro para buffer no espaço de endereço do processo onde os dados são armazenados. O kernel tem que copiar os dados de/para esses locais. O uso mmap()mapeia o arquivo para o espaço de endereço do processo, para que o processo possa endereçar o arquivo diretamente e nenhuma cópia seja necessária.

    Também não há sobrecarga de chamada do sistema ao acessar o arquivo mapeado na memória após a chamada inicial se o arquivo for carregado na memória na inicial mmap(). Se uma página do arquivo mapeado não estiver na memória, o acesso gerará uma falha e exigirá que o kernel carregue a página na memória. Ler um bloco grande com read()pode ser mais rápido do que mmap()nesses casos, se mmap()geraria um número significativo de falhas para ler o arquivo. (É possível avisar o kernel com antecedência madvise()para que o kernel possa carregar as páginas com antecedência antes do acesso).

    Para mais detalhes, há uma questão relacionada no Stack Overflow: mmap() vs. blocos de leitura

    • 20
  2. Andrew Henle
    2018-10-13T01:46:51+08:002018-10-13T01:46:51+08:00

    Primeiro, na maioria das operações de IO, as características do hardware de armazenamento subjacente dominam o desempenho. Uma matriz RAID5 mal configurada de vinte e nove discos SATA SLOW 5400 rpm em um sistema lento e com falta de memória usando RAID S/W com tamanhos de bloco incompatíveis e sistemas de arquivos desalinhados vai lhe dar um desempenho ruim em comparação com um sistema configurado e alinhado corretamente SSD RAID 1+0 em um controlador de alto desempenho, apesar de qualquer ajuste de software que você possa tentar.

    Mas a única maneira de mmap()ser significativamente mais rápido é se você ler os mesmos dados mais de uma vez e os dados lidos não forem paginados entre as leituras devido à pressão da memória.

    Etapas do mapa de memória:

    1. Chamada de sistema para criar mapeamentos virtuais - muito caro
    2. O processo acessa a memória pela primeira vez, causando uma falha de página - caro (e pode precisar ser repetido se for paginado)
    3. O processo realmente lê a memória

    Se o processo apenas executar as etapas 2 e 3 uma vez para cada bit de dados lido, ou os dados forem descartados da memória devido à pressão da memória, mmap()será mais lento.

    read()degraus:

    1. A chamada do sistema copia os dados do disco para o cache de página (pode ou não haver falha de página, os dados podem já estar no cache de página fazendo com que isso seja ignorado)
    2. Dados copiados do cache de página para a memória do processo (pode ou não ter falha de página)

    O mapeamento de memória só vai superar isso em termos de desempenho por causa dessa cópia extra do cache de página para processar a memória. Mas uma mera cópia de uma página de memória (ou menos) precisa ser feita várias vezes para superar o custo de configurar o mapeamento - provavelmente. Quantas vezes depende do seu sistema. Largura de banda da memória, como todo o seu sistema está sendo usado, tudo. Por exemplo, se o tempo usado pelo gerenciamento de memória do kernel para configurar o mapeamento não tivesse sido usado por nenhum outro processo, o custo de criar o mapeamento realmente não seria muito alto. Por outro lado, se você tiver muito processamento em seu sistema que envolva muita criação/destruição de mapeamento de memória virtual (ou seja, muitos processos de curta duração), o impacto da E/S mapeada na memória pode ser significativo.

    Depois, há o read()uso de IO direto:

    1. Chamada de sistema para ler do disco no espaço de memória do processo. (pode ou não causar uma falha de página)

    As leituras diretas de IO são praticamente impossíveis de superar em termos de desempenho. Mas você precisa realmente ajustar seus padrões de E/S ao seu hardware para maximizar o desempenho.

    Observe que um processo pode controlar muito bem se a leitura de dados causa uma falha de página para o buffer que o processo está usando para ler.

    Então, o acesso a arquivos mapeados na memória é mais rápido? Talvez seja, talvez não.

    Depende do(s) seu(s) padrão(ões) de acesso. Junto com seu hardware e tudo mais em seu(s) caminho(s) de E/S.

    Se você estiver transmitindo um arquivo de vídeo de 30 GB em uma máquina com 4 GB de RAM e nunca voltar e reler nenhum dos dados, o mapeamento de memória do arquivo é provavelmente a pior maneira de lê-lo.

    Por outro lado, se você tiver uma tabela de pesquisa de 100 MB para alguns dados que você acessa aleatoriamente bilhões e bilhões de vezes em seu processamento e memória suficiente para que o arquivo nunca seja paginado, o mapeamento de memória esmagará todos os outros métodos de acesso.

    Uma grande vantagem dos arquivos mapeados na memória

    Os arquivos de mapeamento de memória têm uma enorme vantagem sobre outras formas de IO: simplicidade de código. É realmente difícil superar a simplicidade de acessar um arquivo como se estivesse na memória. E na maioria das vezes, a diferença de desempenho entre o mapeamento de memória de um arquivo e a execução de operações de E/S discretas não é tão grande assim.

    • 14

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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