Compartilhe RAM pela rede

47

Meu colega está usando um aplicativo que consome muita memória, o que torna o sistema muito lento. É possível compartilhar memória com outros PCs pela Internet?

O sistema tem 8 GB de RAM e o aplicativo consome mais de 6 GB.

    
por Innov 22.02.2018 / 11:59

16 respostas

159

Eu considerei apenas um aplicativo independente que é executado em uma máquina "padrão" sem a capacidade de simplesmente instalá-lo em outro lugar ou usar hardware ou software especializado. Outras respostas (corretamente) abordam migração de software ou hardware dedicado para a tarefa.

Qualquer forma de "compartilhar RAM" através de uma rede estará sujeita a limitações desse meio de rede. Como mesmo o gigabit Ethernet está limitado a aproximadamente 100MB / s (megabytes), isso significa que sua velocidade de "RAM" também será limitada.

100MB / s é uma pequena fração da velocidade da RAM que está no seu sistema. Seu programa será dolorosamente lento e parece que está sendo executado em um computador do início dos anos 90

Os discos rígidos modernos são, para leitura e gravação seqüencial, um pouco mais rápido do que isso. Os SSDs são várias vezes mais rápidos.

Isto está ignorando os problemas de latência, o que tornará seu programa uma ordem de grandeza mais lenta novamente.

Devido à lentidão e a outros problemas técnicos envolvidos, esse não é um problema que alguém provavelmente considerou valer a pena tentar resolver para sistemas "residenciais" ou "de escritório". É mais barato e mais eficaz comprar mais RAM, se necessário.

Compre mais RAM, ou até mesmo um SSD para um arquivo de paginação. Não há outra maneira de fazer isso que não requeira uma quantidade insana de trabalho ou hardware para um pequeno benefício.

    
por 22.02.2018 / 12:25
73

Apenas para completar: InfiniBand permite acesso direto à memória de outras máquinas.

No entanto, é necessário:

  • Um comutador InfiniBand
  • Um add-on InfiniBand no cartão em cada máquina
  • O aplicativo deve ser programado especificamente para usar este

Ele NÃO funciona em uma rede existente, requer uma infraestrutura completamente independente para todos os nós conectados. Também não funciona na Internet

    
por 22.02.2018 / 15:29
18
Is there any alternative solution?

Isso depende muito da natureza dos dados.

Você pode executar 2 servidores mysql diferentes em duas máquinas diferentes.

Em seguida, divida os dados em 1/2 e escreva o programa para saber automaticamente para qual servidor ir.

É claro que isso pode ser escalado para qualquer número de servidores, se você os tiver disponíveis.

    
por 22.02.2018 / 15:07
15

Sim, é razoavelmente fácil de fazer (e eu fiz isso, para sistemas sem disco que precisam de swap), usando o protocolo Network Block Device.

Instale o nbd-server na máquina do servidor e configure-o para criar automaticamente arquivos por host.

Assegure-se de que suas máquinas clientes tenham o NBD compilado em seus kernels e, em seguida, configure-as para trocar para um dispositivo montado em NBD. O pacote nbd-client pode ajudar.

Desculpe se o acima é um pouco vago - As máquinas que eu fiz isso não são alcançáveis a partir daqui; Eu posso ser capaz de preencher os detalhes quando eu tiver acesso a eles.

Há uma implementação alternativa de servidor NBD chamada nbdkit ; Eu não sei nada sobre isso.

    
por 22.02.2018 / 18:37
9

Dados os detalhes pequenos e sem importância "Windows 10, a estação de trabalho tem 8G B RAM" , há apenas uma resposta sensata: compre mais RAM e execute menos lixo.

Comprar um SSD e colocar o arquivo de paginação lá seria a próxima melhor opção, mas realmente ... compre mais RAM.

Servir o arquivo de paginação ("compartilhar memória") através da rede é obviamente possível, mas é uma péssima idéia. Embora seja verdade que existam casos limítrofes em que o tempo de acesso pela rede será melhor do que acessar uma unidade local, isso é irrelevante para seu caso de uso, pois você precisa de consistente baixo tempo e alta largura de banda ao mesmo tempo. Lembre-se, você não está antecipando uma ou duas falhas de página, você está constantemente trocando. A menos que você esteja disposto a pagar alguns milhares, não há como chegar perto de comprar RAM ou um SSD.

8 GB não é suficiente para executar o Windows 10 e um aplicativo que consome memória ao mesmo tempo. É quase insuficiente para executar o Word, Excel e Outlook ao mesmo tempo. Essa é exatamente a típica "inutilização total da empresa", com a qual milhões de pessoas têm que conviver todos os dias em seus laptops de trabalho. Invista 100-200 moedas em outro módulo de memória, e ele amortiza seu custo em uma semana (coisas que levam minutos agora levam segundos, e tempo é dinheiro - infelizmente isso é difícil de entrar na cabeça do contador local de beans).

Alternativamente, se você possui a máquina, você pode usar o NTLite para reduzir a porcaria do Windows 10, reduzindo sua pegada de memória. Ou você pode simplesmente desativar 80% dos serviços desnecessários. Parece inacreditável, mas é possível executar uma versão recente do Windows com menos de 2 GB de RAM usada.

Mas realmente, basta comprar RAM ... é muito mais rápido e fácil do que gastar horas do seu precioso tempo em reduzir a porcaria do Windows.

    
por 23.02.2018 / 13:23
6

Uma alternativa simples seria executar o aplicativo no PC remoto , possivelmente sob uma conta de usuário dedicada, e simplesmente controlá-lo via RDP, VNC ou o que for conveniente.

    
por 23.02.2018 / 13:55
5

Outra opção é implantar temporariamente o aplicativo em um ambiente onde o RAM pode ser ampliado ou reduzido facilmente.

Eu observaria uma instância do Amazon AWS, que pode ser alterada em tamanho com uma reinicialização.

Ou seja, uma pequena instância como a C5.large tem 4 GB de RAM e 2 núcleos e custa US $ 2,04 por dia para o Linux, ou US $ 4,26 por dia para uma instalação no Windows. O espaço em disco do EBS é um custo extra e é escalado linearmente com o GB alocado.

Você pode configurar seu sistema neste tamanho menor e, em seguida, quando desejar obter um ruído total, pare-o, altere o tamanho da instância e execute o software.

  • m5.4xlarge tem 64 GB de RAM e 16 núcleos, por US $ 18,44 / dia ou US $ 36,10 / dia para janelas.
  • r4.8xlarge é de 244 GB e 32 núcleos, por US $ 51.07 / dia ou US $ 86.40 / dia com janelas.
  • x1.32xlarge é 1952 GB e 128 núcleos, por US $ 320.12 / dia ou US $ 461.43 / dia com janelas

Ou o maior deles ...

  • x1e.32xlarge é 3904 GB e 128 núcleos, por US $ 640,52 / dia ou US $ 781,82 / dia com o Windows. Se o seu colega precisar de mais do que isso, o problema precisa ser reescrito de uma maneira mais ideal.
O

link ajudará você a escolher um tamanho adequado. Observe que alguns locais custam mais que outros. Cingapura e norte da Califórnia são caras. No entanto, sua VM não custa nada quando não está em execução, além dos custos de armazenamento em disco.

A desvantagem é que, se você precisar dessa memória por um longo tempo, comprar o tempo da VM é uma maneira cara de fazer isso. No entanto, os contabilistas parecem, por vezes, preferir os custos operacionais, como o aluguer, aos custos de capital, como atualizações.

    
por 25.02.2018 / 05:57
4

Como outros já disseram, é tecnicamente possível, mas não vale a pena.

No entanto, se você quiser acelerar o uso do seu computador, é possível externalizar alguns de seus aplicativos para um servidor remoto.

Isso dependerá principalmente do que você está trabalhando e de qual aplicativo você usa. Se você estiver executando programas que exigem muito tempo de processamento para uma pequena saída de dados, você poderá executá-los em um servidor diferente do seu computador para economizar tempo e recursos enquanto trabalha em outra coisa.

O exemplo que tenho em mente é um servidor que testa meu código toda vez que eu envio uma modificação. A ideia com essa solução é que ela é limitada a casos de uso específicos.

    
por 22.02.2018 / 17:03
4

Peça ao departamento de TI para comprar mais RAM para o seu PC e demonstre a necessidade de usar uma captura de tela do uso do aplicativo no Gerenciador de Tarefas.

    
por 23.02.2018 / 17:05
3

Existe uma solução comercial para isso, através de uma empresa chamada Kove ( link ). Requer uma infra-estrutura Infiniband para trabalhar no "backplane" (ethernet funciona normalmente), embora outras opções como RoCE por vezes, ser disponibilizado, dependendo de detalhes. Eles fornecem um número de interfaces transparentes para permitir a integração de alteração de código zero e APIs para bypass do kernel com acesso direto da CPU (ou seja, evitando kernel a sobrecarga). Em termos de desempenho, isso depende do seu aplicativo. Se vocês são limitados pela CPU, então o impacto pode ser mínimo (o que pode ser surpreendente). Se você estiver com a largura de banda de memória ligada ao host local, eles lhe darão maior memória, mas você será afogado pelo gargalo já existente. Nisso caso, é vantajoso para a carga de trabalho ter memória maior do que pode ser colocar em uma caixa e não ficar sem RAM? Temos visto (muito) bons resultados com virtualização e bibliotecas de aprendizado de máquina em python. High end HPC aplicações tendem a ser piores, mas usamos as APIs C e conseguimos manter o desempenho aceitável, reduzindo a contagem de nós (os nós estavam lá para a RAM, não para os ciclos de CPU), o que é uma vantagem em comparação com MPI. Se esta é uma boa solução para o seu colega é difícil dizer, mas é uma opção que você pode examinar. Espero que ajude. Para ser claro, eu faço não trabalho para Kove, e não tenho incentivo financeiro, mas eu colaborei com eles por um número de anos e acho que esta tecnologia tem o potencial para impactar substancialmente a maneira como determinada computação é feita.

    
por 22.02.2018 / 23:49
2

Outro ponto de vista - talvez o problema não seja o limite de recursos do sistema, mas a aplicação desnecessária que seu amigo está escrevendo. 6 GB de RAM é muita memória.

Só porque muitos dos outros aplicativos são excessivamente inchados , isso não significa necessariamente que você O aplicativo amigo precisa ser um deles. Usando diferentes métodos de programação pode reduzir os requisitos de memória, melhorando a velocidade. Por exemplo, se o aplicativo carregar o conjunto de dados inteiro na memória e funcionar nele, será muito mais dispendioso do que, por exemplo, armazenar dados no banco de dados SQL (local ou remoto) com poucos índices selecionados e acessá-los por lá. Faça com que ele processe os dados bloco a bloco, se possível, em vez de carregá-los todos de uma vez. Estruturas na memória podem ser um desperdício também. Liberte memória quando estiver pronto. Não carregue na RAM o que você pode mapear em vez de memória. E centenas de outras dicas ...

Se a aplicação realmente precisar de mais memória que precisa ser armazenada em outros computadores, ela pode ser modificada para usar memcached e similares para armazená-lo lá. Pontos de bônus, uma vez que serão escalados melhor no futuro.

    
por 23.02.2018 / 23:32
1

Assim, o usuário pediu que COMO compartilhasse a memória pela rede. Não se for uma boa ideia. Então, aqui está realmente como você pode fazer isso.

Não estou dizendo que essa seja uma boa ideia, ou que seja de alto desempenho, mas deve funcionar.

  • Computador 1="master" - onde o código é executado
  • Computador 2="filho" - doador de memória

Estou assumindo que este não é o Windows Server, onde você poderia criar um ponto de montagem iSCSI.

Computador 1 etapas:

  1. Faça o download do ramdisk gratuito do Dataram: link
  2. Crie um ramdisk e formate-o com o NTFS - as instruções estão disponíveis em seu site
  3. No Gerenciador de Discos, crie um arquivo VHD no ramdisk formatado com NTFS
  4. Compartilhe o diretório raiz do Ramdisk pela rede com o SMB - clique com o botão direito do mouse na unidade, compartilhe, compartilhe esta pasta

Etapas do computador 2:

  1. Mapeie a unidade compartilhada do cild para um Drive
  2. Monte o VHD criado na etapa 3 acima no Gerenciador de discos
  3. Mova o local do arquivo de página local para o VHD montado via Mover Arquivo de Páginas do Windows
  4. Remova todas as outras entradas do arquivo de paginação.

Feito!

Advertências - talvez seja possível ignorar o absurdo do VHD se o Windows permitir que você mova o arquivo de paginação para o compartilhamento de rede. Não há muitos exemplos disso online (por razões óbvias).

Instabilidade completa do sistema pode ocorrer, ou algo totalmente diferente. Ninguém sabe realmente o que aconteceria.

    
por 28.02.2018 / 21:41
0

Como você mencionou "RAM" para compartilhar através da rede não apenas "memória" de qualquer tipo, a resposta final será teoricamente sim, praticamente não.

Enquanto outros tipos de memória, como armazenamento e outros dados temporários, são compartilhados regularmente pela rede para várias finalidades e motivos. Da mesma forma, a RAM pode ser tecnicamente possível de ser compartilhada pela rede, se necessário. Mas o desempenho e o custo serão altos demais para serem viáveis no mundo real.

A RAM ou a memória de acesso aleatório é usada por um sistema operacional como espaço de trabalho, portanto, muitas operações de leitura / gravação são executadas nela. Em um sistema comum, a capacidade de velocidade de dados com a RAM é maior em comparação com outras partes. Se você colocar RAM em uma rede, você precisa ter capacidade de transferência de dados muito alta velocidade e custo será muito alto, mesmo se possível para alcançar tecnicamente. Com uma pequena parte do custo de uma atualização de velocidade de rede, você obterá RAM para sua máquina localmente.

    
por 23.02.2018 / 01:05
0

Os aplicativos geralmente são executados na memória virtual, portanto, o requisito de memória virtual pode exceder a memória física disponível do sistema sem nenhuma conseqüência além do desempenho. O sistema operacional irá simplesmente página de memória virtual para o disco para liberar memória física conforme necessário em qualquer momento para uso ativo. Isso geralmente funciona bem para aplicativos que têm uma localidade razoável (a atividade em determinado momento é um pouco focada em áreas limitadas do aplicativo). espaço de memória virtual). Se um aplicativo tiver localidade ruim (referenciando constantemente a memória em todo o seu espaço virtual), ele terá um desempenho ruim, a menos que toda a memória virtual possa ser acomodada na memória física (toda a sua memória virtual é residente).

Existem algumas possibilidades aqui:

  • Se o aplicativo tiver apenas uma pegada grande, mas uma boa localidade, você poderá executá-lo no computador que tiver disponível; o desempenho pode ser aceitável, pode ou não melhorar notavelmente em um computador com mais memória.
  • Se a localidade for ruim, você verá que ela será executada no computador disponível de qualquer maneira, muito mal. (Este parece ser o caso para você)
  • Atualize a unidade de disco magnético (assumida) para uma unidade de estado sólido (elas são significativamente mais rápidas)
  • Adicione memória ao computador que você tem disponível (se possível)
  • Talvez seja necessário encontrar um computador com mais memória e executá-lo.
  • Aprimore o aplicativo para que ele tenha uma área virtual menor ou uma melhor localização (se você estiver ou estiver associado ao autor do aplicativo).

A idéia de usar memória em um computador remoto é basicamente criar um arquivo de paginação . Em teoria, pode funcionar, mas, na prática, o desempenho será muito melhor se o arquivo de paginação for local para o computador (seu próprio disco rígido) devido à largura de banda e latência da rede. Não importa se o sistema remoto está hospedando o arquivo de paginação em sua memória ou em seu disco, o gargalo (limitador de desempenho mais significativo) será a rede. Isso será especialmente verdadeiro na Internet, mas também será verdadeiro mesmo se o computador remoto estiver adjacente na mesma LAN.

    
por 25.02.2018 / 02:30
0

Isso realmente depende do tipo de aplicativo e do que o RAM é usado.

Por exemplo, muitos aplicativos da Web podem usar a RAM na rede conectando-se a um servidor memcached . Isso permitirá armazenar dados em cache (e outros dados que devem ser rápidos para acessar) em outro computador com muita memória RAM.

É claro que isso é específico do aplicativo e precisa de um aplicativo que possa usar o memcached. Isso não ajudará você a abrir uma segunda instância de folga, pois um navegador não suporta o uso de um back-end de cache.

    
por 27.02.2018 / 13:16
-1

Em vez de compartilhar a RAM, codifique esse aplicativo para criar um arquivo .exe filho , que será executado no PC da Rede e faça o mesmo nesse computador.

    
por 28.02.2018 / 18:14