Quando devo usar / dev / shm / e quando devo usar / tmp /?


139

Quando devo usar /dev/shm/e quando devo usar /tmp/? Posso sempre contar com os dois presentes no Unices?

Respostas:


101

/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 .

Da Wikipedia :

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/shmvez de /tmpaumentar 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/shmestar presente, certamente não em máquinas com memória. Você deve usar, a /tmpmenos que tenha um bom motivo para usá-lo /dev/shm.

Lembre-se de que /tmppode 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.


1
Vou usá-lo para redirecionar a saída da saída de erro padrão de um comando para um arquivo. Então vou ler este arquivo e processá-lo. Farei isso milhares de vezes (faz parte da condição de uma construção de loop). Eu pensei que a memória seria boa neste caso. Mas também quero que seja portátil. Acho que vou verificar se /dev/shmexiste, usá-lo se existir, ou fazer o fallback para /tmp. Isso soa bem?
Excluído

1
Eu também adicionaria uma verificação do tamanho mínimo e do nível de uso atual de / dev / shm para evitar enchê-lo inadvertidamente.
nagul 23/09/09

4
No Linux 2.6 e posterior, é necessário que o / dev / shm seja montado para que as chamadas do sistema de memória compartilhada POSIX, como shm_open (), funcionem. Em outras palavras, alguns programas serão interrompidos se não estiverem montados - assim deve ser. Não é apenas um disco RAM. Portanto, você deve garantir que alguns dos / dev / shm sejam gratuitos.
EdHard

7
Não há aumento de desempenho usando /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). /tmppode ser tmpfs ou não, dependendo de como o administrador o configurou. Não há um bom motivo para usar /dev/shmem seus scripts.
Gilles

3
@GaretClaborn Há muitas boas razões para usar a memória suportada pela troca, mas isso é chamado de memória de processo normal. Se você estiver usando um arquivo, ele é chamado de sistema de arquivos, e todos os sistemas de arquivos são memória (cache), que é apoiada por swap se o sistema de arquivos for algo como tmpfs. A alocação de espaço em disco entre swap e outras áreas de armazenamento é tipicamente real do administrador. Se um aplicativo quiser arquivos que tendem a permanecer na RAM, /tmpé o local normal (com $TMPDIRa substituição). A escolha a ser /tmpapoiada por swap, outro espaço em disco ou nada é da responsabilidade do administrador.
Gilles

61

Em ordem decrescente de tmpfsprobabilidade:

┌───────────┬──────────────┬────────────────┐
│ /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:

  1. Quando usar esses diretórios, com base nas boas práticas
  2. Quando é apropriado usar tmpfs

Boas práticas

Edição conservadora (mistura de convenções da ESF e uso comum):

  • Em caso de dúvida, use /tmp.
  • Use /var/tmppara dados grandes que podem não caber facilmente no RAM.
  • Use /var/tmppara dados benéficos para manter as reinicializações (como um cache).
  • Use /dev/shmcomo 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.
  • Se ainda estiver em dúvida, forneça uma maneira de o usuário substituir. Por exemplo, o mktempprograma honra a TMPDIRvariável de ambiente.

Edição pragmática:

Use /dev/shmquando for importante usar tmpfs, /var/tmpquando for importante não usar , caso contrário /tmp.

Onde tmpfs se destaca

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 fsyncliçã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.

Onde tmpfs é apropriado

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_centisecsinfinito 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.

Com o que tmpfs não pode ajudá-lo

  • Leia o desempenho. Se seus dados estiverem quentes (o que é melhor se você considerar mantê-los em tmpfs), você atingirá o pagecache de qualquer maneira. A diferença é quando não está atingindo o pagecache; se for esse o caso, vá para "Where tmpfs sux", abaixo.
  • Arquivos de curta duração. Eles podem viver a vida inteira no pagecache (como páginas sujas ) antes mesmo de serem gravados. A menos que você force isso, é fsyncclaro.

Onde tmpfs sux

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 é:

  • O motivo mais simples: não há nada que os dispositivos de armazenamento contemporâneos (seja com base em disco ou flash) adore mais do que ler arquivos razoavelmente sequenciais organizados ordenadamente por um sistema de arquivos adequado. É improvável que a troca de blocos 4KiB melhore isso.
  • O custo oculto: Trocando para fora . As páginas Tmpfs estão sujas - elas precisam ser gravadas em algum lugar (para trocar) para serem despejadas do pagecache, em vez de páginas limpas com backup de arquivo que podem ser eliminadas instantaneamente. Essa é uma penalidade de gravação extra em tudo o que compete pela memória - afeta outra coisa em um momento diferente do uso dessas páginas tmpfs.

No meu ubuntu 14.04 / dev / shm está o link para / run / shm, que possui o sistema de arquivos "none" de acordo com o comando df. O tamanho é de cerca de 2G, no entanto.
Jarno

3
@jarno Primeiramente, economizando o número de pontos de montagem tmpfs, eu chamaria um detalhe de implementação. Em segundo lugar, não deixe o nome do dispositivo confundir você - procure em / proc / mounts (esse é o lugar certo para procurar) e você verá que o tipo é "tmpfs" enquanto o dispositivo é o que não é "nenhum" aqui. Sim, o nome do dispositivo não significa nada no tmpfs - você pode, mount -t tmpfs "jarno is great" /mnt/jarnose quiser! Terceiro, o tamanho padrão é metade da quantidade de RAM - aposto que você tem 4GiB de RAM.
user2394284

1
Existe uma opção que aloque um tamanho fixo de RAM e prometa nunca usar swap?
palswim

@palswim: Isso seria um ramdisk. Não vejo uma opção para isso no tmpfs , exceto por o antecessor do tmpfs não suportar troca. Os processos podem bloquear suas páginas no ram, o que é sem dúvida menos louco do que o bloqueio das páginas tmpfs no ram, considerando que o killer do OOM não pode liberar o último, caso a memória fique insuficiente.
user2394284

18

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.


24
Concordou, exceto pela conclusão, "NUNCA use / dev / shm". Você deseja usar / dev / shm nos casos em que não deseja que um arquivo seja gravado no disco e deseja minimizar a E / S do disco. Por exemplo, preciso baixar arquivos zip muito grandes de um servidor FTP, descompactá-los e importá-los para um banco de dados. Descompacte em / dev / shm para que, tanto para as operações de descompactação como de importação, o HDD precise executar apenas metade da operação, em vez de ir e voltar entre a origem e o destino. Acelera imensamente o processo. Esse é um exemplo de muitos, mas concordo que é uma ferramenta de nicho.
Nathan estiramento

4

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.


Também não há um aspecto de desempenho? Como o / dev / shm costuma ser montado como um volume tmpfs e essencialmente como um disco RAM?
Excluído

Você também pode montar / tmp como um sistema de arquivos tmpfs, faço isso no meu netbook para acelerar algumas coisas, reduzindo gravações no SSD (lento). É claro que há desvantagens em fazer isso (principalmente o uso de RAM, mas meu netbook tem muito mais memória RAM do que geralmente precisa).
David Spillett

No meu caso específico, eu o usaria para uma espécie de comunicação de processo. Capto a saída do erro padrão de um aplicativo e ajo sobre o conteúdo (e ainda preciso da saída padrão intocada, por isso não posso fazer nada 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 /tmpcomo eu acho que não é tão comum Se é mais comum para. /dev/shmentão isso é melhor para mim Mas eu estou olhando para obter orientações sobre portabilidade etc..
excluídos

1

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.


0

/ 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.


0

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.


(Eu acho que isso está dentro do espírito do que foi originalmente solicitado.) O que quero dizer basicamente é que me sinto confortável usando / dev / shm como um disco RAM, desde que eu tenha memória suficiente. Se é ineficiente fazê-lo de alguma forma, isso não deve dissuadi-lo de fazê-lo, mas deve desencadear uma pergunta como "Como posso ter um disco ram no linux?". A resposta é / dev / shm
David Grove
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.