AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1116427
Accepted
Shayne Fitzgerald
Shayne Fitzgerald
Asked: 2022-11-24 07:19:47 +0800 CST2022-11-24 07:19:47 +0800 CST 2022-11-24 07:19:47 +0800 CST

Linux - disco RAM como parte de um volume lógico espelhado

  • 772

Temos um servidor com 64 GB de RAM total, os aplicativos estão usando normalmente no máximo 30 GB dessa RAM disponível. Um desses aplicativos lida com muitos arquivos simples e estamos tendo problemas de taxa de transferência, ou seja, aguardando a E/S do disco. Ao explorar possíveis soluções, surgiu a ideia de um disco RAM. O problema que tenho com um disco RAM é a volatilidade inerente.

Encontrei documentação separada sobre discos RAM, configuração RAID 1 e volumes espelhados lógicos para agrupar discos físicos , mas não consigo encontrar nenhuma documentação que sugira se qualquer uma dessas soluções de replicação de disco pode ser usada com um disco RAM. Mais importante, já que a ideia é ter o disco RAM disponível para leitura/gravação e ter o disco físico "sombreando" o disco RAM, alcançando as gravações, gostaríamos que o disco RAM fosse o disco "primário" para todos lê/escreve.

Para observar, gostaríamos de evitar apenas o cache de arquivos da RAM com o sistema operacional, mas se pudermos obter o mesmo desempenho de um disco RAM autônomo, isso pode funcionar. Inicialmente, evitamos isso, pois muitas vezes determinados arquivos não são acessados ​​por longos períodos de tempo, mas ainda precisam da velocidade de leitura/gravação sob demanda.

linux
  • 8 8 respostas
  • 1612 Views

8 respostas

  • Voted
  1. Best Answer
    forest
    2022-11-24T18:17:19+08:002022-11-24T18:17:19+08:00

    Para observar, gostaríamos de evitar apenas o cache de arquivos da RAM com o sistema operacional, mas se pudermos obter o mesmo desempenho de um disco RAM autônomo, isso pode funcionar. Inicialmente, evitamos isso, pois muitas vezes determinados arquivos não são acessados ​​por longos períodos de tempo, mas ainda precisam da velocidade de leitura/gravação sob demanda.

    Você poderia usar vmtouchpara resolver seu problema. Este é um utilitário que permite que você fixe certos arquivos ou mesmo diretórios inteiros e tudo sob eles no cache da página para que não sejam despejados, mesmo que não sejam acessados ​​por longos períodos de tempo (que foi seu motivo inicial para não simplesmente contando com o cache da página). Isso requer no máximo a mesma quantidade de memória que seu disco RAM, ou menos na prática. Você ainda estará usando o cache de página, mas resultará em desempenho semelhante ao uso de um disco RAM para tudo (na verdade, desempenho superior, pois o driver MD não estará envolvido).

    • 26
  2. Tero Kilkanen
    2022-11-24T08:54:44+08:002022-11-24T08:54:44+08:00

    Isso pode ser hackeado em conjunto, mas é uma má ideia e provavelmente tem vários problemas de confiabilidade e manutenção.

    Acho que um RAID1 de RAMdisk e disco físico seria limitado ao desempenho do disco físico, já que parte da funcionalidade do RAID1 é garantir que ambas as cópias estejam sincronizadas.

    Para leituras, pode haver algum benefício, porque o driver MD pode distribuir leituras entre diferentes dispositivos.

    Possíveis etapas para criar isso:

    1. Crie um arquivo vazio, que tenha o tamanho da matriz que você deseja suportar
    2. Use losetuppara criar um dispositivo de bloco a partir do arquivo.
    3. Use mdadmpara criar a matriz com o dispositivo de bloco recém-criado e a partição de disco rígido correspondente.
    4. Crie um sistema de arquivos no novo array MD.

    Eu não tentei isso sozinho, então é apenas um exemplo teórico de como isso poderia ser feito.

    • 13
  3. Austin Hemmelgarn
    2022-11-24T18:39:32+08:002022-11-24T18:39:32+08:00

    Em primeiro lugar, um disco RAM quase nunca é a resposta correta no Linux. Por ser um dispositivo de bloco, você acaba com qualquer leitura tendo que passar pela camada de bloco, pelo sistema de arquivos e pela camada VFS regular, e os dados acabam armazenados em cache na RAM, além de serem armazenados no disco RAM. Essa duplicação de dados, bem como o número de camadas adicionais envolvidas, é o motivo pelo qual o tmpfs existe no Linux, em vez de envolver a camada de blocos, um sistema de arquivos tmpfs apenas armazena dados diretamente no cache da página, ignorando toda a complexidade extra. Também ocorre o dimensionamento automático com base na quantidade de dados armazenados nele (em vez de ter que ter o tamanho definido antecipadamente) e pode até aproveitar o espaço de troca. Se você acha que precisa de um ramdisk, então 99% do tempo você realmente deveria estar usando o tmpfs.


    Agora, no que diz respeito às soluções reais...

    Se todos os seus dados realmente couberem na RAM, é muito melhor fixá-los todos na RAM, usando uma ferramenta como vmtouch ou fazendo com que o aplicativo mapeie todos os arquivos e chame mlock em todas as regiões mapeadas.

    Se seus dados não couberem na RAM, você tem duas opções realistas:

    • Armazene os dados compactados em disco, de preferência usando um sistema de arquivos que forneça compactação transparente, como BTRFS, F2FS ou ZFS. Desde que você tenha uma CPU razoavelmente rápida, isso geralmente reduzirá o tempo necessário para ler um arquivo grande, ao custo de exigir um pouco mais de tempo de CPU. A melhoria geralmente é proporcional à compactação dos dados, mas em muitos casos pode ser facilmente traduzida em uma melhoria de 30% ou mais.
    • Procure investir em armazenamento mais rápido. O suficiente para apenas substituir o armazenamento existente ou uma quantidade menor que você pode usar com o bcache para acelerar funcionalmente o armazenamento existente.
    • 8
  4. shodanshok
    2022-11-24T07:44:03+08:002022-11-24T07:44:03+08:00

    Se você precisa de persistência, um RAMDISK não é a solução correta.

    Eu sugiro fortemente investir em um par de disco NVMe rápido (leia-se: nível empresarial, com proteção contra perda de energia) para colocar em uma matriz RAID1 clássica (espelhado).

    • 7
  5. Criggie
    2022-11-24T16:32:19+08:002022-11-24T16:32:19+08:00

    Eu fiz algo assim usando discos efêmeros da AWS, que são muito rápidos, mas não sobrevivem a um ciclo de ligar/desligar.

    Tínhamos um "disco semente" que era um volume EBS barato normal de GP2 (GP3 agora) e estava em um RAID1 com os discos efêmeros rápidos

    Eu criei um script bash para rc.local para descobrir com a nvme listsaída do comando se havia um disco efêmero e juntá-lo ao ataque quando apropriado.
    No seu caso, algo na inicialização teria que criar o ramdisk, juntá-lo ao array degradado existente.

    PROD pathservice1.taws ~ $ nvme list
    Node             SN                   Model        Namespace Usage                 Format           FW Rev
    ---------------- --- ----------------------------- --------- -------------------- ---------------- --------
    /dev/nvme0n1     123 Amazon Elastic Block Store          1   128.85 GB / 128.85 GB    512   B +  0 B   1.0
    /dev/nvme1n1     234 Amazon Elastic Block Store          1   107.37 GB / 107.37 GB    512   B +  0 B   1.0
    /dev/nvme2n1     345 Amazon Elastic Block Store          1   2.20   TB /  2.20  TB    512   B +  0 B   1.0
    /dev/nvme3n1     456 Amazon EC2 NVMe Instance Storage    1   900.00 GB / 900.00 GB    512   B +  0 B   0
    /dev/nvme4n1     567 Amazon EC2 NVMe Instance Storage    1   900.00 GB / 900.00 GB    512   B +  0 B   0
    

    Os dois últimos são discos efêmeros de 900G cada.

    • Use a opção "escrever principalmente" no volume EBS. Ele ainda fará leituras se o disco rápido estiver ausente ou ainda não tiver esses blocos. Depois que o disco rápido for preenchido (ou "aquecido"), as leituras acontecerão lá.

    O bom é que as gravações no dispositivo mdX persistirão por meio de reinicializações e desligamentos ordenados. É possível que desligamentos inesperados possam causar a perda de gravações.

    Portanto, este é um substituto ruim para um backup - você ainda deve fazer backups usando qualquer método que funcione para você.

    • 7
  6. fraxinus
    2022-11-25T01:52:24+08:002022-11-25T01:52:24+08:00

    Se você tem tanto RAM livre (que pode conter a maioria desses arquivos e seus metadados), é provável que eles residam principalmente no cache de RAM e seu fator limitante não seja ler, mas escrevê-los.

    Se for esse o caso, espelhar à força esse volume na RAM não trará nenhum desempenho.

    No possível caso em que outra atividade de i/o constantemente expulsa seus arquivos da RAM, bloquear essa quantidade de RAM para sua solução semelhante a um disco provavelmente afetará esses outros processos de i/o.

    • 4
  7. André LFS Bacci
    2022-11-25T06:06:36+08:002022-11-25T06:06:36+08:00

    Memcached, Redis

    Você basicamente descreveu o Memcached e um pouco o Redis. Ambos são bons em cache, o Redis tem melhor suporte para persistência.

    Observe que você só pode obter "todo" o desempenho se esses arquivos simples tiverem menos de 30 GB de tamanho total (em sua máquina), caso contrário, algum mecanismo de despejo deve ser empregado. Mesmo assim, se este aplicativo usa alguns arquivos com muita frequência, uma solução Redis/Memcached aumentaria o desempenho.

    Esses produtos são bem suportados pelos fornecedores, então você pode usar servidores Memcached/Redis hospedados externos para isolar completamente sua máquina das especificidades do cache.

    • 3
  8. Juergen
    2022-11-27T01:17:41+08:002022-11-27T01:17:41+08:00

    A questão é sobre a velocidade e persistência do disco RAM . Isso é possível desde que se permita gravações assíncronas (mantenha o disco "acompanhando as gravações").

    Desde que o aplicativo evite usar syncou fsync, ele roda mais rápido e é mais fácil de configurar usando o cache regular sem usar um disco RAM e uma configuração de volume espelhado.

    Para manter o aplicativo em execução, mesmo que ele grave grandes quantidades de dados que sujam grandes quantidades de memória, é necessário permitir 32 GB de memória suja no caso desta questão. Isso mantém todas as gravações de disco nos threads de liberação do kernel longe do processo do aplicativo e é configurado por
    sysctl vm.dirty_bytes=$((32*1024*1024*1024)) # 32 GB

    (O padrão é sysctl vm.dirty_ratio=20que não permite que mais de 20% da memória "disponível" fique suja, afogando o aplicativo se esse limite for atingido, o que acontece muito antes de 32 GB de memória ficarem sujos.)

    Como o aplicativo "lida com muitos arquivos simples", suspeito que ele tenha um comportamento de leitura linear, de modo que a pré-busca explícita dos dados não seria útil. Mas se tivesse um comportamento de leitura aleatório, o cache deveria ser aquecido antes de iniciar o aplicativo.

    • 0

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve