Criando um disco ram no Linux

70

Eu tenho uma máquina com 62 GB de RAM e um tronco com apenas 7 GB, então pensei em criar um disco RAM e compilar lá. Eu não sou um especialista em Linux. Encontrei instruções na internet para criar o disco RAM:

mkfs -q /dev/ram1 8192

mas mudei o 8192 para 16777216 na tentativa de alocar 16 GB de disco ram.

Eu recebi o seguinte erro:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

Nesse ponto, fiquei assustado e fui libertado.

sudo dmidecode --type 17 | grep Size

mostra

8x8192MB + 2048MB = 67584 MB

mas duem /dev804K.

Esse é o problema? Posso superar esse /devtamanho?

Frank
fonte
15
Você tentou tmpfs? É um sistema de arquivos na RAM, sem a necessidade de ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch 27/02
Isso funcionou! Obrigado! Mas até agora, não há muita velocidade: acho que as ferramentas que estou usando para criar ainda estão usando o disco normal. Vou colocar mais coisas no disco ram.
27413 Frank
3
Colocar as ferramentas no ramdisk não deve fazer muita diferença, pois o kernel as armazenará em cache de qualquer maneira no ram.
t-8ch 27/02/2013
11
@goldilocks É uma evidência anedótica, mas ao compilar nossos projetos Java com o Maven, há uma aceleração significativa ao usar um ramdisk. Eu acho que isso é mais por causa do tempo de busca do que do tempo de leitura.
SpellingD
11
/ dev / shm, na verdade / run / shm , pode ser usado; está quase sempre lá.
Camille Goudeseune

Respostas:

78

A melhor maneira de criar um disco ram no linux é tmpfs. É um sistema de arquivos vivendo em ram, portanto não há necessidade de ext2. Você pode criar um tmpfs de tamanho de 16 GB com:

mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch
fonte
2
no meu sistema, com nada em / mnt, ele diz: ls: não pode acessar / mnt / tmpfs: Não existe montagem de arquivo ou diretório: o ponto de montagem / mnt / tmpfs não existe. Isso é algo para se preocupar? Se eu simplesmente mkdir / mnt / tmpfs, isso derrota o objetivo (criando tmpfs no disco normal - por favor, sem chamas, sou iniciante aqui).
27413 Frank
9
Você precisa de um ponto de montagem (diretório) como destino; portanto, depois de criar este diretório (você pode usar qualquer diretório, o conteúdo existente ficará sombreado), poderá montá-lo com o comando da resposta.
t-8ch 27/02/2013
11
tmpfspode usar swap, o que você provavelmente não deseja em um disco RAM puro.
palswim
2
@RomanSusi tmpfs é o tipo de arquivo (passado após -t). "nenhum" é o dispositivo de suporte ( "disco") que não existe para tmpfs
t-8ch
11
Pode ser interessante notar que especificar o tamanho é opcional. O padrão é metade da RAM. Não é necessário especificar um tamanho maior, basta definir um limite, para se proteger de usar acidentalmente toda a sua RAM e matar o sistema.
sourcejedi
20

O Linux é muito eficiente no uso de RAM. Há pouca surpresa que você vê pouca ou nenhuma aceleração tmpfs. As maiores partes a serem lidas na memória (e, portanto, capazes de retardar o processo) são as ferramentas (compilador, montador, vinculador) e, por muito tempo, makeelas serão carregadas na memória na inicialização e nunca mais serão abandonadas. O que resta é a leitura na fonte (a gravação dos resultados não o deixará mais lento, a menos que haja muita restrição de memória). Novamente, os arquivos de cabeçalho comuns ficarão por perto, apenas a fonte do usuário exigirá leitura. E é improvável que seja mais do que alguns megabytes. Criando um grande disco RAM (ou mesmo muito uso tmpfs) pode muito bem as coisas lentas para baixo (fazendo a memória construção constrangidos, os arquivos no disco RAM ou na tmpfs não pode ser usado diretamente de lá).

vonbrand
fonte
11
O que! Como eles não podem ser usados ​​diretamente de lá?
Kazark 28/02
Eles estão na RAM, mas não em um formato diretamente utilizável.
vonbrand
2
Realmente! Como assim? (Perdoe minha lentidão.)
Kazark
8
@ Kazark, para manipular executáveis ​​na memória, estruturas de dados especiais são usadas. Como os discos de RAM e tmpfsnão são de uso comum para armazenar arquivos executáveis ​​(os discos de RAM são um remanescente dos bons velhos tempos de disquetes dolorosamente lentos e, tmpfspor exemplo, para dados temporários estritos), ninguém considerou importante o suficiente adicionar os hacks feios necessários.
28613 vonbrand
7
Eu tentei rodar meu código rails a partir de um sistema de arquivos tmpfs (RAM) e não vi nenhuma diferença. Eu estava realmente esperando uma diferença notável, mas fiquei desapontado com o quão impressionante é o Linux.
Khaja Minhajuddin 4/03/13
6

O problema é que o tamanho máximo de um ramdisk, mais especificamente o tamanho da memória que pode ser acessado através do driver ramdisk, é configurado em tempo de compilação, pode ser sobrescrito em tempo de inicialização, mas permanece fixo quando o kernel é carregado na memória. O valor padrão provavelmente é medido em megabytes. Se bem me lembro, a memória de um ramdisk está reservada quando o driver é carregado, todos os ramdisks têm o mesmo tamanho e existem 16 por padrão. Então, nem você deseja um tamanho de ramdisk de 16G :-)

Conforme indicado na outra resposta, tmpfs é o que você deseja usar. Além disso, você não ganhará muito tendo todo o seu sistema operacional em um ramdisk / tmpfs. Apenas copie seu builddir para um tmpfs e faça sua compilação então. Pode ser necessário garantir que todos os resultados temporários sejam gravados em um local que também esteja nos tmpfs.

Bananguin
fonte
Na verdade, eles não usam nenhuma memória até você escrever coisas para eles. O limite de tempo de inicialização é apenas o limite. Mesmo depois de preencher um, você pode liberar a memória de volta blockdev --flushbufs.
Psusi
@psusi: você pode nos dar mais informações sobre isso? Só consigo encontrar declarações mencionando que uma vez reivindicada pela memória ramdisk nunca é recuperada, por exemplo, nas Documentation/blockdev/ramdisk.txtfontes do kernel. E na minha resposta: esse arquivo também diz que o ramdisk cresce à medida que a memória é consumida e, portanto, nem tudo é alocado de uma só vez.
Bananguin 01/03
Que tipo de informação? Você executa o comando e ele libera o carneiro, supondo que você ainda não o tenha montado.
Psusi
Como você sabe que o comando faz o que você diz que faz? Sua página de manual não confirma isso e a documentação na árvore de fontes do kernel pode ser entendida como contradizendo suas informações.
Bananguin 01/03
6
Eu li o código fonte e o verifiquei ao tentar.
Psusi
3

Para criar um grande disco ram após a inicialização, sem mexer nos parâmetros do kernel, isso parece funcionar. Use tmpfs, crie um arquivo, monte-o via loop e monte-o através de um sistema de arquivos:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Provavelmente um pouco de penalidade de desempenho passando por várias camadas diferentes ... mas pelo menos funciona.

user39725
fonte
3

Além disso , tmpfse ramfsoutra opção é o /dev/ram0dispositivo de bloco. Nas versões recentes do Ubuntu, este dispositivo não existe por padrão, mas pode ser criado via modprobe brd.

Essa abordagem é mais previsível, pois cria um ext4sistema de arquivos real e nunca excede o limite especificado. Mas são necessárias mais etapas para configurar e usa a RAM com menos eficiência.

Usando o módulo brd kernel (/ dev / ram0)

Para criar e inicializar um disco de 4 GB de RAM:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

O rd_nrparâmetro especifica quantos discos RAM a serem criados (por padrão, ele cria 16, ou seja, /dev/ram0através /dev/ram15). O rd_sizeparâmetro é tamanho em kilobytes . A $(( ... ))sintaxe permite fazer aritmética no shell.

Para desalocar o disco RAM, desmonte-o e remova o brdmódulo do kernel:

umount /ramdisk
modprobe -r brd

Criando um dispositivo de bloco dentro ramfs

Como alternativa, você pode criar um dispositivo de bloco dentro de ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

O truncatecomando cria um arquivo vazio de um determinado tamanho, para que seja inicializado (ou seja, consome memória) sob demanda.

Para desalocar o disco RAM, desmonte-o e exclua a imagem do disco:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

Comparação com tmpfseramfs

Embora tmpfse ramfssejam mais eficientes do que usar um dispositivo de bloco, abaixo estão algumas de suas desvantagens.

tmpfspode trocar para o disco. Isso é mais eficiente, mas pode haver momentos em que você queira um disco de RAM puro:

  • Os arquivos com os quais você está trabalhando são sensíveis (por exemplo, arquivos de uma partição criptografada).
  • Você está testando o desempenho e não deseja que a E / S do disco seja um fator (o tempo de gravação do SSD pode variar bastante).
  • Você está descompactando um arquivo grande e não deseja desgastar seu SSD.

ramfsé fácil de configurar, recupera espaço depois de excluir arquivos e usa a RAM com mais eficiência (o sistema não armazena em buffer os arquivos porque sabe que eles estão na RAM). Mas tem suas próprias desvantagens e surpresas:

  • O dfutilitário não relata o uso de espaço:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Não há parâmetro de limite de tamanho. Se você colocar muito no ramdisk, seu sistema travará.

  • Arquivos esparsos podem ficar desparasitados quando você menos espera. Esta manhã, copiei uma imagem de VM (150G, mas 49G usada no disco) para ramfs(tenho 128G de RAM). Isso funcionou. Mas quando eu copiei a partir da ramfspara o destino, o meu sistema tornou-se indiferente. O cputilitário aparentemente encheu os buracos na leitura , mas não na escrita.

Ambos tmpfse ramfspodem se comportar de maneira diferente de um ext4sistema de arquivos real . Criar um dispositivo de bloco na RAM e inicializá-lo ext4evita isso.

Para uma comparação mais aprofundada: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Joey Adams
fonte
1

OP a quantidade de RAM é expressa em MB. Então, tudo o que você precisa para entrar é 16384. E pronto, você estará no negócio.

CyberWolf64
fonte
11
Não. "Se o tamanho fs não tiver um sufixo, ele será interpretado como potência de dois kilobytes". - homemmkfs.ext2
sourcejedi
1

Você pode montar um ramfssistema de arquivos, copiar seu projeto e trabalhar a partir daí. Isso garante que seus arquivos de entrada sejam carregados na RAM e não serão lidos novamente a partir da unidade de disco muito mais lenta. No entanto, como você descobriu, essa geralmente não é uma estratégia útil. Você já recebe exatamente o mesmo benefício.

O Ramfs é um sistema de arquivos muito simples que exporta os mecanismos de cache de disco do Linux (o cache da página e o cache do dentry) como um sistema de arquivos baseado em RAM redimensionável dinamicamente.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Você já pode confiar que seus arquivos de entrada são armazenados em cache na RAM, na primeira vez em que são lidos. Seus arquivos de saída também são armazenados em cache, para que você não espere que eles sejam gravados no disco.

Não há limite artificial para quanto você pode armazenar em cache, por quanto tempo ele fica armazenado em cache, etc. Os caches começam a ser descartados apenas após o preenchimento da RAM. Qual cache é descartado primeiro é escolhido por algoritmos terrivelmente elaborados. A primeira aproximação, é descrevê-la como Menos Utilizada Recentemente. Consulte Quais algoritmos de substituição de página são usados ​​no kernel do Linux para cache de arquivos do SO?

Observe que o seu editor de texto fsync()salvará explicitamente os arquivos no disco.

Se você executar testes de um programa que envolve fsync(), executá-los em um sistema de arquivos como esse ramfspode acelerá-los. Outra estratégia é tentar desativar fsync()com eatmydata/ nosync.so.

Alguns outros sistemas operacionais podem ter limitações específicas, que podem ser ignoradas usando um ramdisk. Em uma extremidade, a falta de qualquer arquivo cache é por isso que ramdisks eram populares em DOS .

tmpfs

tmpfsfunciona da mesma forma que ramfs, exceto que ele pode usar espaço de troca, se você tiver um. Ou seja, se você precisar de RAM para outra coisa, os algoritmos Menos Utilizados Recentemente podem selecionar blocos de dados de tmpfs e trocá-los para o disco.

A maioria das pessoas continua tmpfs, porque também permite limitar o tamanho total e mostra o espaço usado corretamente, por exemplo, no dfcomando. Não sei por que essa diferença existe. O limite de tamanho em tmpfsprotege você de encher acidentalmente toda a sua RAM e basicamente matar o seu sistema. O padrão é metade da sua RAM.

Outras razões pelas quais as gravações podem ficar mais lentas

O acima é uma simplificação adaptada ao seu caso. As gravações nos arquivos no seu caso não precisam aguardar o disco. No entanto, existem alguns casos de gravações que o fazem. Veja a excelente postagem no blog Por que as gravações em buffer às vezes são interrompidas . O caso mais surpreendente é uma mudança recente no Linux chamada "gravação de página estável".

sourcejedi
fonte