Respostas:
/dev/shm
é um sistema de arquivos de armazenamento temporário de arquivos, ou seja, tmpfs , que usa RAM para o armazenamento de backup. Pode funcionar como uma implementação de memória compartilhada que facilita o IPC .
As recentes compilações do kernel Linux 2.6 começaram a oferecer / dev / shm como memória compartilhada na forma de um ramdisk, mais especificamente como um diretório gravável em mundo que é armazenado na memória com um limite definido em / etc / default / tmpfs. O suporte ao / dev / shm é completamente opcional no arquivo de configuração do kernel. Ele está incluído por padrão nas distribuições Fedora e Ubuntu, onde é usado mais amplamente pelo aplicativo Pulseaudio. (Enfase adicionada.)
/tmp
é o local para arquivos temporários, conforme definido no padrão de hierarquia do sistema de arquivos , seguido por quase todas as distribuições Unix e Linux.
Como a RAM é significativamente mais rápida que o armazenamento em disco, você pode usá-lo em /dev/shm
vez de /tmp
aumentar o desempenho , se o seu processo for intensivo de E / S e usar extensivamente arquivos temporários.
Para responder às suas perguntas: Não, você nem sempre pode confiar em /dev/shm
estar presente, certamente não em máquinas com memória. Você deve usar, a /tmp
menos que tenha um bom motivo para usá-lo /dev/shm
.
Lembre-se de que /tmp
pode fazer parte do /
sistema de arquivos em vez de uma montagem separada e, portanto, pode crescer conforme necessário. O tamanho de /dev/shm
é limitado pelo excesso de RAM no sistema e, portanto, é mais provável que você fique sem espaço nesse sistema de arquivos.
/dev/shm
. /dev/shm
é a memória (tmpfs) suportada pelo disco (swap). /var/tmp
é a memória (cache do disco) suportada pelo disco (sistema de arquivos em disco). Na prática, o desempenho é praticamente o mesmo (o tmpfs tem uma ligeira vantagem, mas não o suficiente para importar). /tmp
pode ser tmpfs ou não, dependendo de como o administrador o configurou. Não há um bom motivo para usar /dev/shm
em seus scripts.
/tmp
é o local normal (com $TMPDIR
a substituição). A escolha a ser /tmp
apoiada por swap, outro espaço em disco ou nada é da responsabilidade do administrador.
Em ordem decrescente de tmpfs
probabilidade:
┌───────────┬──────────────┬────────────────┐
│ /dev/shm │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp │ can be tmpfs │ FHS 1.0 │
├───────────┼──────────────┼────────────────┤
│ /var/tmp │ never tmpfs │ FHS 1.0 │
└───────────┴──────────────┴────────────────┘
Como você está perguntando sobre um ponto de montagem tmpfs específico do Linux versus um diretório definido como portável que pode ser tmpfs (dependendo do seu sysadmin e do padrão da sua distribuição), sua pergunta tem dois aspectos, que outras respostas enfatizaram de maneira diferente:
Edição conservadora (mistura de convenções da ESF e uso comum):
/tmp
./var/tmp
para dados grandes que podem não caber facilmente no RAM./var/tmp
para dados benéficos para manter as reinicializações (como um cache)./dev/shm
como efeito colateral da chamada shm_open()
. O público-alvo são buffers limitados que são sobrescritos infinitamente. Portanto, isso é para arquivos de longa duração, cujo conteúdo é volátil e não é muito grande.mktemp
programa honra a TMPDIR
variável de ambiente.Edição pragmática:
Use /dev/shm
quando for importante usar tmpfs, /var/tmp
quando for importante não usar , caso contrário /tmp
.
fsync
é um não operacional no tmpfs. Este syscall é o inimigo número um do desempenho (IO) (e longevidade do flash, se você se importa com isso), embora se você se encontre usando tmpfs (ou eatmydata) apenas para derrotar o fsync, você (ou algum outro desenvolvedor da cadeia) está fazendo algo errado. Isso significa que as transações para o dispositivo de armazenamento são desnecessariamente refinadas para o seu objetivo - você está claramente disposto a pular alguns pontos de salvamento para desempenho, pois agora chegou ao extremo de sabotar todos eles - raramente o melhor compromisso. Além disso, é aqui na área de desempenho de transações onde estão alguns dos maiores benefícios de ter um SSD - qualquer SSD decente terá um desempenho fora deste mundo em comparação com o que um disco giratório pode suportar (7200 rpm = 120 Hz) , se nada mais estiver acessando), para não mencionar os cartões de memória flash, que variam muito nessa métrica (principalmente porque é uma troca com desempenho sequencial, que é a classificação por eles, por exemplo, classificação da classe do cartão SD). Então cuidado,
Quer ouvir uma história ridícula? Minha primeira fsync
lição: eu tinha um trabalho que envolvia "atualizar" rotineiramente vários bancos de dados Sqlite (mantidos como caixas de teste) para um formato atual em constante mudança. A estrutura "upgrade" executaria vários scripts, fazendo pelo menos uma transação cada, para atualizar um banco de dados. Obviamente, atualizei meus bancos de dados em paralelo (8 em paralelo, desde que fui abençoado com uma poderosa CPU de 8 núcleos). Mas, como eu descobri, não houve aceleração da paralelização (um pequeno golpe ), porque o processo estava totalmente vinculado à IO. Hilariamente, envolver a estrutura de atualização em um script que copiou cada banco de dados /dev/shm
, atualizou-o lá e copiou-o de volta para o disco foi 100 vezes mais rápido (ainda com 8 em paralelo). Como um bônus, o PC era utilizável também, ao atualizar bancos de dados.
O uso apropriado do tmpfs é evitar a gravação desnecessária de dados voláteis. Desativando efetivamente o write-back , como definir o /proc/sys/vm/dirty_writeback_centisecs
infinito em um sistema de arquivos regular.
Isso tem muito pouco a ver com desempenho, e falhar é uma preocupação muito menor do que abusar do fsync: o tempo limite de write-back determina com que preguiça o conteúdo do disco é atualizado após o conteúdo do pagecache e o padrão de 5 segundos é muito tempo para um computador - um aplicativo pode substituir um arquivo com a frequência desejada, no pagecache, mas o conteúdo do disco é atualizado apenas uma vez a cada 5 segundos. A menos que o aplicativo o force com fsync, isso é. Pense em quantas vezes um aplicativo pode gerar um arquivo pequeno nesse período e veja por que sincronizar cada um deles seria um problema muito maior.
fsync
claro.Mantendo dados frios . Você pode ficar tentado a pensar que servir arquivos fora de troca é tão eficiente quanto um sistema de arquivos normal, mas há algumas razões pelas quais não é:
mount -t tmpfs "jarno is great" /mnt/jarno
se quiser! Terceiro, o tamanho padrão é metade da quantidade de RAM - aposto que você tem 4GiB de RAM.
Ok, aqui está a realidade.
Os tmpfs e um sistema de arquivos normal são um cache de memória em disco.
O tmpfs usa memória e espaço de troca, pois o armazenamento de arquivos em um sistema de arquivos usa uma área específica do disco, nem é limitado no tamanho que o sistema de arquivos pode ter, é bem possível ter um tmpfs de 200 GB em uma máquina com menos de um GB de RAM, se você tem espaço de troca suficiente.
A diferença está em quando os dados são gravados no disco. Para um tmpfs, os dados são gravados SOMENTE quando a memória fica cheia demais ou é improvável que os dados sejam usados em breve. Os sistemas de arquivos Linux mais comuns da OTOH são projetados para ter sempre um conjunto de dados mais ou menos consistente no disco, portanto, se o usuário puxar o plugue, não perderá tudo.
Pessoalmente, estou acostumado a ter sistemas operacionais que não travam e sistemas UPS (por exemplo: baterias de laptop), então acho que os sistemas de arquivos ext2 / 3 são muito paranóicos com seu intervalo de verificação de 5 a 10 segundos. O sistema de arquivos ext4 é melhor com um ponto de verificação de 10 minutos, exceto que trata os dados do usuário como segunda classe e não os protege. (ext3 é o mesmo, mas você não percebe por causa do ponto de verificação de 5 segundos)
Esse ponto de verificação frequente significa que dados desnecessários estão sendo continuamente gravados no disco, mesmo para / tmp.
Portanto, o resultado é que você precisa criar um espaço de troca tão grande quanto o seu / tmp (mesmo que seja necessário criar um arquivo de troca) e usar esse espaço para montar tmpfs do tamanho necessário em / tmp.
NUNCA use / dev / shm.
A menos que você esteja usando-o para arquivos IPC muito pequenos (provavelmente mmap'd) e tenha certeza de que ele existe (não é um padrão) e a máquina possui mais do que suficiente memória + troca disponível.
Use / tmp / para arquivos temporários. Use / dev / shm / quando quiser memória compartilhada (ou seja, interprocesse a comunicação através de arquivos).
Você pode confiar no / tmp /, mas / dev / shm / é uma coisa relativamente recente do Linux.
1>/dev/null 2>&1
. Eu faria isso milhares de vezes, para que um tmpfs fosse bom. No entanto, se eu liberar o script eu não posso confiar em tmpfs sendo usada para /tmp
como eu acho que não é tão comum Se é mais comum para. /dev/shm
então isso é melhor para mim Mas eu estou olhando para obter orientações sobre portabilidade etc..
Outro momento em que você deve usar / dev / shm (para Linux 2.6 e superior) é quando você precisa de um sistema de arquivos tmpfs garantido, porque não sabe se pode gravar em disco.
Um sistema de monitoramento com o qual estou familiarizado precisa gravar arquivos temporários enquanto cria seu relatório para envio a um servidor central. Na prática, é muito mais provável que algo impeça gravações em um sistema de arquivos (o espaço em disco ou uma falha RAID subjacente levou o sistema ao modo somente leitura de hardware), mas você ainda poderá manobrar para alertar sobre isso, do que se algo espiraisse toda a memória disponível, de modo que tmpfs fique inutilizável (e a caixa não esteja morta). Em casos como esse, um sistema de monitoramento prefere gravar na RAM para potencialmente ser capaz de enviar um alerta sobre um disco cheio ou um hardware que está morrendo / morrendo.
/ dev / shm é usado para drivers e programas específicos de sistema de memória virtual compartilhada.
Se você estiver criando um programa que requer um heap de memória virtual que deve ser mapeado para a memória virtual. Isso vale duas vezes, se você precisar de vários processos ou threads para poder acessar com segurança essa memória.
O fato é que, apenas porque o driver usa uma versão especial do tmpfs para isso, não significa que você deve usá-lo como uma partição tmpfs genérica. Em vez disso, você deve apenas criar outra partição tmpfs se desejar uma para o seu diretório temporário.
Em PERL, com um mínimo de 8 GB em qualquer máquina (todos executando o Linux Mint), acho que é um bom hábito fazer algoritmos complexos baseados em DB_File (estrutura de dados em um arquivo) com milhões de leituras e gravações usando / dev / shm
Em outros idiomas, sem ter gigether em todos os lugares, para evitar as partidas e paradas na transferência de rede (trabalhando localmente em um arquivo localizado em um servidor em um ambiente cliente-servidor), usando um arquivo em lotes de algum tipo, copiarei o arquivo arquivo inteiro (300-900MB) de uma vez para / dev / shm, execute o programa com saída para / dev / shm, escreva os resultados novamente no servidor e exclua de / dev / shm
Naturalmente, se eu tivesse menos RAM, não faria isso. Normalmente, o sistema de arquivos em memória do / dev / shm lê como um tamanho que é metade da sua RAM disponível. No entanto, o uso comum da RAM é constante. Então você realmente não poderia fazer isso em um dispositivo com 2 GB ou menos. Para transformar a paráfrase em exagero, geralmente há coisas na RAM que nem o sistema informa corretamente.
/dev/shm
existe, usá-lo se existir, ou fazer o fallback para/tmp
. Isso soa bem?