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 du
em /dev
dá 804K
.
Esse é o problema? Posso superar esse /dev
tamanho?
mount -o size=16G -t tmpfs none /mnt/tmpfs
Respostas:
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:
fonte
tmpfs
pode usar swap, o que você provavelmente não deseja em um disco RAM puro.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,make
elas 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 usotmpfs
) pode muito bem as coisas lentas para baixo (fazendo a memória construção constrangidos, os arquivos no disco RAM ou natmpfs
não pode ser usado diretamente de lá).fonte
tmpfs
nã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,tmpfs
por exemplo, para dados temporários estritos), ninguém considerou importante o suficiente adicionar os hacks feios necessários.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.
fonte
blockdev --flushbufs
.Documentation/blockdev/ramdisk.txt
fontes 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.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:
Provavelmente um pouco de penalidade de desempenho passando por várias camadas diferentes ... mas pelo menos funciona.
fonte
Além disso ,
tmpfs
eramfs
outra opção é o/dev/ram0
dispositivo de bloco. Nas versões recentes do Ubuntu, este dispositivo não existe por padrão, mas pode ser criado viamodprobe brd
.Essa abordagem é mais previsível, pois cria um
ext4
sistema 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:
O
rd_nr
parâmetro especifica quantos discos RAM a serem criados (por padrão, ele cria 16, ou seja,/dev/ram0
através/dev/ram15
). Ord_size
parâmetro é tamanho em kilobytes . A$(( ... ))
sintaxe permite fazer aritmética no shell.Para desalocar o disco RAM, desmonte-o e remova o
brd
módulo do kernel:Criando um dispositivo de bloco dentro
ramfs
Como alternativa, você pode criar um dispositivo de bloco dentro de
ramfs
:O
truncate
comando 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:
Comparação com
tmpfs
eramfs
Embora
tmpfs
eramfs
sejam mais eficientes do que usar um dispositivo de bloco, abaixo estão algumas de suas desvantagens.tmpfs
pode trocar para o disco. Isso é mais eficiente, mas pode haver momentos em que você queira um disco de RAM puro: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
df
utilitário não relata o uso de espaço: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 daramfs
para o destino, o meu sistema tornou-se indiferente. Ocp
utilitário aparentemente encheu os buracos na leitura , mas não na escrita.Ambos
tmpfs
eramfs
podem se comportar de maneira diferente de umext4
sistema de arquivos real . Criar um dispositivo de bloco na RAM e inicializá-loext4
evita isso.Para uma comparação mais aprofundada: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
fonte
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.
fonte
mkfs.ext2
Você pode montar um
ramfs
sistema 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.- 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 esseramfs
pode acelerá-los. Outra estratégia é tentar desativarfsync()
comeatmydata
/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
tmpfs
funciona da mesma forma queramfs
, 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, nodf
comando. Não sei por que essa diferença existe. O limite de tamanho emtmpfs
protege 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".
fonte