O Linux tmpfs grava velocidade mais lenta que a velocidade da RAM

1

Eu tenho um servidor HPE ProLiant DL360 Gen9, as especificações são:

  • CPU: CPUs Intel Xeon 2 E5-2687W v3 a 3.10GHz, 25MB de cache L3, 10 núcleos e
  • RAM: 8x 32GB PC4-17000 DDR4 2133MHz CAS-15 DIMM SDRAM 1.2V (Total de 256 GB)

(especificações completas do servidor aqui )

O servidor está executando CentOS 7.2 com o kernel 3.10.0-327.36.3.el7.x86_64 .

Montei um ramdisk tmpfs no servidor usando a seguinte entrada em /etc/fstab :

tmpfs  /ramdisk  tmpfs  noauto,user  0 0

Para testar a gravação nesse ramdisk, eu então executo o seguinte comando:

time sh -c "dd if=/dev/zero of=/ramdisk/120GB_testfile bs=4k count=30000000 && sync"

Ele informa que escreveu 122.880.000.000 bytes em 58.857s, que é uma velocidade de gravação de 1991 MiB / s.

Considerando que a velocidade de gravação dessa memória é de 17 GB / s -Speed-and-Data-Rate / ta-p / 172489 "> esta descrição das taxas de dados de memória), estou surpreso com a taxa consideravelmente menor ao gravar no meu ramdisk tmpfs. Alguém pode explicar a disparidade e sugerir outra maneira de gravar em um arquivo na memória que é mais rápido?

Obrigado.

UPDATE

Desativei vm.swappiness , mas isso não gerou nenhum benefício (1712 MiB / s).

Eu tentei aumentar o tamanho do bloco também ( bs=256k count=468750 ), mas novamente, não muito de um efeito (2087 MiB / s).

    
por atreyu 10.05.2018 / 16:24

1 resposta

3

Há mais coisas acontecendo do que simplesmente colocar dados na RAM quando você está usando um sistema de arquivos na memória. Você ainda precisa manipular as estruturas de dados associadas ao arquivo, incluindo o rastreamento em que, na memória, estão todas as alocações para ele. Escrever essas informações também leva tempo (em particular, para o teste que você está fazendo, o tamanho do arquivo está sendo atualizado em cada gravação, o que imediatamente duplica o número de lugares que os dados estão mudando na memória).

Além disso, a alocação de memória é extremamente lenta. Na verdade, trata-se de uma das coisas mais lentas que você pode fazer na maioria dos sistemas que não envolvem E / S, sendo que a única coisa significativamente mais lenta é criar um novo thread ou processo. Ferramentas como ramspeed pré-alocam toda a memória que irão usar quando são inicializadas, para que possam testar o desempenho real da memória. Em comparação, o tmpfs não tem idéia do tamanho de um arquivo que você vai criar, então ele tem que alocar tudo sob demanda, e o faz em pedaços não maiores do que o tamanho do bloco dd (acho que é 64k, mas não tenho certeza). Por causa disso, você tem sobrecarga em cada bloco para alocar memória para armazenar esse bloco.

    
por 10.05.2018 / 21:01