Estou tentando descobrir algo que simplesmente não consigo encontrar uma boa resposta.
Se eu disser que um cache REDIS (ou algum cache externo na memória) localizado em um datacenter e um servidor de aplicativos no mesmo datacenter, qual será a velocidade da conexão de rede (latência, taxa de transferência) para leitura de dados entre essas duas máquinas?
A "velocidade" da rede, por exemplo, ainda será pelo menos uma ordem de magnitude superior à velocidade da RAM que está buscando meus dados fora do cache no REDIS?
Minha pergunta final é: ter tudo isso guardado na memória do REDIS realmente fornece algum utilitário? Em contraste com se o REDIS estava colocando tudo isso em cache em um SSD? A memória é cara. Se a rede não é realmente um gargalo DENTRO do datacenter, a memória tem valor. Caso contrário, isso não acontece.
Acho que minha pergunta geral é: apesar das vastas incógnitas nos datacenters e da incapacidade de generalizar, bem como das variações, estamos falando de ordens de magnitude suficientes entre a latência da memória em um sistema de computador e até as melhores redes internas de um CD que a memória latências reduzidas não fornecem uma melhoria significativa no desempenho? Eu entendo que existem muitas variáveis, mas quão perto é? É tão próximo que essas variáveis são importantes? Por exemplo, adote uma postura hiperbólica, uma unidade de fita é MUITO mais lenta que a rede, portanto, a fita não é ideal para um cache.
Respostas:
Existem várias versões dos "gráficos de latência que todos deveriam conhecer", como:
O fato é que, na realidade, há mais do que apenas latência. É uma combinação de fatores.
Então, qual é a latência da rede em um data center? Latência, bem, eu diria que é "sempre" abaixo de 1ms. É mais rápido que a RAM? Não. É perto da RAM? Acho que não.
Mas a questão permanece, é relevante. Esse é o dado que você precisa conhecer? Sua pergunta faz sentido para mim. Como tudo tem um custo, você deve obter mais memória RAM para que todos os dados possam permanecer na memória RAM ou é bom ler do disco de tempos em tempos.
Sua "suposição" é que, se a latência da rede for mais alta (mais lenta) que a velocidade do SSD, você não estará obtendo todos os dados na RAM, pois terá a lentidão na rede.
E parece que sim. Mas você também precisa levar em consideração a simultaneidade. Se você receber 1.000 solicitações de dados de uma só vez, o disco pode fazer 1.000 solicitações simultâneas? Claro que não, então quanto tempo levará para atender a essas 1.000 solicitações? Comparado com a RAM?
É difícil reduzi-lo a um único fator, como cargas pesadas. Mas sim, se você tivesse uma única operação em andamento, a latência da rede é tal que você provavelmente não perceberia a diferença entre SSD e RAM.
Assim como até o disco de 12 Gbps aparecer no mercado, um link de rede de 10 Gbps não seria sobrecarregado por um único fluxo, pois o disco era o gargalo.
Mas lembre-se de que seu disco está fazendo muitas outras coisas, seu processo não é o único na máquina, sua rede pode levar coisas diferentes etc.
Além disso, nem todas as atividades do disco significam tráfego de rede. A consulta ao banco de dados proveniente de um aplicativo no servidor de banco de dados é apenas um tráfego de rede muito mínimo. A resposta do servidor de banco de dados pode ser muito pequena (um único número) ou muito grande (milhares de linhas com vários campos). Para executar a operação, um servidor (servidor de banco de dados ou não) pode precisar fazer várias buscas, leituras e gravações em disco, mas apenas enviar um pequeno pedaço de volta pela rede. Definitivamente, não é um disco de rede RAM individual.
Até agora, evitei alguns detalhes da sua pergunta - especificamente, a parte Redis.
OK, então isso significa que tudo está na memória. Desculpe, este disco SSD rápido não o ajudará aqui. Os Redis podem manter os dados no disco, para que possam ser carregados na RAM após uma reinicialização. Isso é apenas para não "perder" dados ou precisar repovoar um cache frio após uma reinicialização. Portanto, neste caso, você terá que usar a RAM, não importa o quê. Você precisará ter RAM suficiente para conter seu conjunto de dados. RAM insuficiente e acho que o seu sistema operacional utilizará
swap
- provavelmente não é uma boa ideia.fonte
Existem muitas camadas de cache nos sistemas de computador. Inserir um na camada de aplicativo pode ser benéfico, armazenando em cache as consultas de API e de banco de dados. E possivelmente dados temporários, como sessões de usuário.
Armazenamentos de dados como o Redis fornecem esse serviço em uma rede (rápida) ou soquete UNIX (ainda mais rápido), como se você usasse um banco de dados.
Você precisa medir o desempenho do seu aplicativo, mas vamos fazer um exemplo. Digamos que uma solicitação de usuário comum faça 5 consultas de API com 50 ms cada. 250 ms é a latência detectável pelo usuário. Contraste para armazenar em cache os resultados. Mesmo se o cache estiver em uma zona de disponibilidade diferente na cidade (não é o ideal), os hits provavelmente são de 10 ms no máximo. O que seria uma aceleração de 5x.
Na realidade, os sistemas de banco de dados e armazenamento também têm seus próprios caches. No entanto, geralmente é mais rápido obter um resultado pré-buscado do que passar pelo mecanismo de banco de dados e pelas camadas do sistema de armazenamento novamente. Além disso, a camada de armazenamento em cache pode reduzir significativamente a carga do banco de dados por trás dela.
Para um exemplo desse cache em produção, não procure além do blog de infraestrutura Stack Overflow sobre arquitetura . Centenas de milhares de solicitações HTTP que geram bilhões de acessos Redis são bastante significativas.
A DRAM nos tempos de acesso de 100 ns é aproximadamente 100x mais rápida que o armazenamento permanente em estado sólido. É relativamente barato para esse desempenho. Para muitas aplicações, um pouco mais de RAM compra velocidade e tempo de resposta valiosos.
fonte