Eu tenho um aplicativo Java em que a escalabilidade é principalmente limitada pela RAM, que eu gostaria de executar em um ou mais servidores em um datacenter. Onde devo procurar hardware de servidor que possa acomodar 100 GB - 512 GB ou mais de RAM? Eu não sou especialista nesses assuntos, então realmente não sei por onde começar.
Isso está entrando no território dos supercomputadores (6 dígitos ou mais) ou eu poderia obter um servidor desse tipo por menos de cinco dígitos?
Algumas notas com base em algumas perguntas abaixo:
- Sim, tentei pensar em maneiras de remover esse requisito de escalabilidade, e não, isso não é realmente uma opção. O aplicativo requer fundamentalmente acesso aleatório muito rápido a grandes quantidades de dados, o armazenamento em um disco rígido (via banco de dados talvez) não será suficiente.
- Tenho certeza de que a JVM pode, pelo menos em teoria, escalar tão longe. Executo regularmente meu código com 10 GB alocados à Sun 1.6 JVM sem problemas perceptíveis.
Tudo bem, olhe. Você não encontrará um servidor que possua o tipo de área de RAM que procura, pelo menos não um que não exija sua própria rede elétrica.
Por que não adotar uma abordagem escalável e usar o memcached? Você pode espalhar a memória para diferentes máquinas na rede. Os dados nunca precisam tocar em uma unidade de disco e, com o tipo de rede ultrarrápida que você pode comprar com o dinheiro que está falando, a latência dificilmente será um problema.
Aqui está um cliente memcached para java: http://www.whalin.com/memcached/
E aqui está uma introdução ao memcached, caso você não esteja familiarizado: http://www.danga.com/memcached/
Olhe para isso. Será muito mais econômico do que construir uma única máquina monstro com uma quantidade insana de RAM. Além disso, se você está fazendo algo que tem esse tipo de requisito, provavelmente é uma missão crítica e não precisa de um único ponto de falha.
fonte
Os servidores Opteron de 4 ou 8 soquetes, como o HP DL585 ou DL785 ou o Sun X4600, podem consumir grandes quantidades de memória na faixa de 128 a 256 GB. Embora não sejam baratos, certamente não estão em preços de 6 dígitos; Um Sun X4600 de 8 vias e 32 núcleos, com 256 GB de RAM, custa cerca de US $ 35.000 em seu site, e é tão grande quanto esse tipo de sistema. Você provavelmente descobrirá que pode obter o sistema por um preço menor do que o preço de tabela mostrado no site.
Embora os DIMMs de 4Gb estejam disponíveis, eles tendem a ter um preço muito alto, portanto, subir para um sistema estendido com eles seria consideravelmente mais caro.
Se você deseja usar um sistema desse tipo, precisará de um sistema operacional de 64 bits. Certifique-se de obter também uma JVM de 64 bits e verifique se ela funciona bem com seu aplicativo.
fonte
Não repetirei as sugestões de hardware (que são boas), mas você pode querer olhar para o Terracotta para ver se ele se encaixa no seu aplicativo.
http://www.terracotta.org/
fonte
Tenha absolutamente cuidado com o tamanho dessas RAMs. Escalamos uma máquina HP para 64 GB (a HP afirmou que a máquina pode levar 128 GB), mas somente depois de adicionar uma placa riser adicional, um eixo de refrigeração e assim por diante (depois de muitas conversas com a HP).
Somente porque uma máquina é especificada para ocupar até n GB, isso não significa que funcionará sem alterações adicionais. No nosso caso, nem todos os módulos de memória normais funcionaram, porque ficaram quentes, apenas módulos muito específicos funcionaram.
fonte
O custo da RAM não é linear para tamanhos grandes. Só porque posso comprar um DIMM de 1 GB por US $ 15, não significa que posso obter um servidor com 128 GB por apenas US $ 1.920 ... para começar, você não encontrará uma placa-mãe com 128 slots DIMM.
Acima de um determinado tamanho (~ 8 a 16 GB), você começa a ver placas-mãe que exigem DIMMs com buffer completo (FB-DIMMs), o que custará consideravelmente mais por GB do que a memória padrão da área de trabalho.
Usamos regularmente máquinas com 128 GB de memória e o preço diminuiu bastante nos últimos anos, mas não tenho números atuais ... nem nenhuma experiência de quão bem a JVM seria dimensionada para esse tamanho de memória .
fonte
Na verdade, você tem muitas opções: na lista da HP, você tem o blade BL680c, que pode levar 128 GB, o DL580 / 585, 256GB e o DL785, 512GB. Algumas das IBM chegam a 256 GB, assim como a Dell também.
fonte
Eu acho que você começará a ter problemas de 64GB no hardware tradicional. Se você puder escalar a partir daí, você ficaria bem, mas meu palpite é que a solução mais econômica seria questionar sua arquitetura. É verdade que digo isso sem o conhecimento do que você está fazendo, mas estou jogando isso lá fora.
fonte
A solução EC2 da Amazon seria viável para você? Certamente seria a solução mais econômica.
fonte
Digamos que você possa colocar tanta memória em um servidor (se não me engano, o Linux no hardware padrão é limitado a 64 GB, mas não tenho certeza).
Na maioria dos sistemas operacionais, a JVM é restrita a um espaço de heap de cerca de 1,4 GB a 1,6 GB, em parte porque a memória contígua é necessária e, em parte, devido às restrições do sistema operacional.
Portanto, uma RAM extra não ajudaria a expandir um aplicativo, apenas permitiria executar várias instâncias do aplicativo. No entanto, você precisaria de vários núcleos e enfrentaria vários outros problemas.
Para que você precisa de tanta RAM? Você pode encontrar bancos de dados que podem ser armazenados na memória ou usar uma unidade de RAM, mas não conheço uma JVM que permita armazenar tantas coisas na memória.
fonte
Uma maneira típica de obter mais memória do sistema é obter mais sistemas. Se a memória é realmente o gargalo, não é a quantidade de memória que você tem, mas o quão bem seus dados estão conectados aos seus processadores. Você precisará dimensionar muitas coisas para que isso lhe faça muito bem.
Para esclarecer, apenas adicionar alguns zeros à memória do sistema provavelmente não fará o que você pensa. O que você encontrará é que agora que todo o seu conjunto de dados cabe na memória, ou mesmo uma fatia um pouco maior, você encontra algum outro gargalo, como a invalidação do cache.
A maneira correta de dimensionar seu sistema é lenta. Se você está atualmente executando, digamos, em um sistema de 4 núcleos com 8 GB de RAM, primeiro analise o inferno do seu aplicativo para ver onde realmente está gastando tempo, tente experimentar 12 ou 16 GB de RAM e veja como os resultados da criação de perfil foram alterados.
A verdadeira questão é: por que você precisaria cerca de 100 vezes a memória do sistema, em relação a outros recursos, do que normalmente está disponível. Se o seu padrão de acesso a dados é previsível, o que você deve fazer é aumentar a largura de banda do disco, vários controladores RAID com vários discos distribuídos conseguirão isso.
Se o seu padrão de acesso a dados é muito, muito aleatório, provavelmente há espaço para um algoritmo otimizado.
fonte
Você provavelmente precisa de um servidor especializado para isso.
Tente olhar para o ES7000 da Unisys. A descrição provavelmente está um pouco desatualizada.
Pode suportar até 512 GB de RAM. Está usando sistemas operacionais conhecidos, como Windows e Linux Enterprise.
Vai custar ~ US $ 30K para a configuração padrão, mas com Itanium e todos os sinos e assobios, pode chegar a ~ US $ 600K.
Com tanta memória RAM, você pode manter muitos dados quentes sem tocar no espaço em disco.
fonte
Você obviamente precisa de sistemas operacionais de 64 bits, mas não está no território dos supercomputadores. Apenas como exemplo, os PowerEdge R900 e R905 da Dell estão disponíveis com 256 GB de RAM e usam processadores Intel Xeon / AMD Opteron padrão e executam Linux, Solaris ou Windows 2003 e 2008.
Obviamente, comprar RAM diretamente na Dell não é muito econômico (eles querem ~ US $ 35.000 por 32 x 8 GB, enquanto você pode adquiri-lo por cerca de US $ 23.000, possivelmente menos), mas por outro lado, pode querer para garantir que você tenha o suporte adequado se estiver comprando um servidor de US $ 40.000 (não esperava que 256 GB de RAM fossem baratos, não é? Se 128 GB também estiverem OK, você poderá economizar ~ 12.000 US $).
Não tenho experiência em qual sistema operacional escolher, porém, executar 100 + GB de Java geralmente não é algo que eu faço :)
fonte
Que tal uma solução completamente pronta para uso: um banco de dados. Eu sei que você disse que seria muito lento, mas isso se baseia no que está hospedando. Que tal hospedá-lo em uma matriz RAID0 suficiente destes.
US $ 400 para o gadget, a Pricewatch lista os chips em US $ 55 (não verifiquei a compatibilidade) por 4 GB, então isso significa outros US $ 440 para a memória. Isso dá a você 32gb por US $ 840. (Em teoria, o dispositivo pode receber chips de 8 GB, totalizando 64 GB, mas ainda não há suporte para chips.)
RAID0 4 deles e você está no limite inferior do seu alcance por um pouco mais de US $ 3000 + uma caixa comum. 16 deles obtêm o valor mais alto do seu range por US $ 14k.
Se isso é utilizável ou não, isso também se resume à natureza dos seus dados - esses dispositivos são voláteis e esgotam a bateria de backup em algumas horas, embora possam fazer backup em um cartão CF.
fonte
Sou um grande fã da abordagem "muitos servidores baratos". Você já pensou em talvez executar esse tipo de processo na plataforma Eucalyptus, disponível no Ubuntu 9.04? É possível executar esse tipo de programa em alguns computadores em sua própria rede gigabit dedicada com vários servidores com 8, 16 ou 32 GB de RAM e escalar de forma linear, adicionando servidores mais baratos quando necessário.
fonte
Eu li o seu comentário sobre a natureza do seu aplicativo, mas ainda assim, você pode considerar soluções alternativas.
O FusionIO é uma alternativa real. Apenas dê uma olhada . Em 10K $, ainda é muito mais barato que o servidor de ponta. Escreva largura de banda de 1,0 GB / s - isso soa realmente louco.
Outra opção é SSD, é claro. Caso você tenha visto as especificações do SSD Intel® X25-E Extreme:
Colocar vários deles no array RAID 10 pode fornecer desempenho suficiente. E com US $ 400 por 32 GB, é muito mais barato que os servidores high-end alternativos.
fonte
Da mesma forma que a sugestão do FusionIO, você pode obter dispositivos que permitem conectar RAM dinâmica a uma interface SATA. Algo como este (eu não tenho nenhuma experiência do produto ou empresa, é apenas a primeira opção que saiu de uma busca "Google Shopping").
Você pode usar alguns deles como um sistema de arquivos montado para armazenar em cache os dados usando a lógica do seu aplicativo (ele é suportado por bateria e deve sobreviver à inicialização e outras interrupções) ou você pode usá-los como espaço de troca e permitir que o kernel decida como usá-los ( embora como os kernels do SO geralmente sejam otimizados, assumindo que todos os locais de troca são mais ordens de magnitude mais lentos e mais latentes do que a RAM real, então será provável que você precise ajustá-lo significativamente para aproveitar melhor esse arranjo).
A opção FusionIO terá melhor relação custo / benefício, se você realmente precisar de algo tão grande, esse tipo de unidade de RAM pode ser melhor como um compromisso. Descobrindo quão bem um servidor capaz de 128 GB de RAM na placa-mãe e alguns deles com 64 GB preenchidos comparam o preço e o desempenho a um servidor especializado que suporta 256 GB ou mais diretamente, deixo como exercício para o leitor!
fonte
3 anos após a questio, as coisas são muito mais fáceis.
Estive pesquisando algumas configurações Siliconmechanics .
A maneira mais barata seria usar plataformas AMD com 32 dimms - 512GB - 11.940 $ .
Uma alternativa, mas muito mais cara por GB, é uma plataforma Intel com 64 dimms - 1 TB - 48,769 $ .
fonte