Dados obtidos do ping: é ida e volta ou ida?

28

Eu tenho 2 servidores, cada um em dois locais separados. Preciso hospedar um aplicativo em um e o servidor de banco de dados no outro.

No servidor de aplicativos, se eu efetuar ping no servidor de banco de dados, recebo em média 30ms.

Minha pergunta é:

When I query the database from the app;

Vai demorar 30 ms + database_server_query_run_time

Ou;

Vai demorar 30 ms + database_server_query_run_time+ 30ms

Eu gostaria de entender isso, por favor.

Phil
fonte

Respostas:

24

Geralmente, são necessárias mais do que essas duas opções.

O ping mede apenas o tempo do cliente, do servidor e vice-versa (rtt - tempo de ida e volta)

Geralmente, os bancos de dados usam TCP, então você primeiro precisa enviar um pacote SYN para iniciar o handshake TCP (para simplificar, digamos 15ms * + tempo da CPU, você recebe e SYN / ACK (15ms + tempo da CPU), envia de volta um ACK e um request (pelo menos 15ms + tempo da CPU), o tempo para o banco de dados processar a consulta e o tempo (15ms + CPU) para recuperar os dados e um pouco mais para confirmar e fechar a conexão.

É claro que isso não conta a autenticação (nome de usuário / senha) para o banco de dados e nenhuma criptografia (handshakes ssl / DH ou o que for necessário).

* metade do tempo de ida e volta, assumindo que a rota para lá e para trás seja simétrica (metade do tempo para chegar lá e metade para voltar ... o tempo de processamento da CPU para resposta de ping é muito curto)

mulaz
fonte
O problema do handshake de três vias pode ser encontrado em sessões TCP persistentes.
26712 Michuelnik
@Michuelnik, você poderia elaborar? Eu realmente gostaria de entender tudo isso e encontrar a melhor maneira de minimizar a latência para consultar o banco de dados.
Phil
2
Infelizmente, a maioria dos softwares (pelo menos aplicativos da Web) não suporta isso: / Mas a idéia é estabelecer a conexão (uma vez) com o banco de dados e manter a conexão em execução (aberta) e continuar enviando consultas / obtendo respostas sobre uma, conexão constantemente aberta. Isso elimina a necessidade de handshakes tcp, autenticação etc. sempre.
mulaz
mulaz, obrigado por explicar. Eu vou trabalhar com Python, então vamos ver como vai. ;-)
Phil
Não se esqueça do tamanho da solicitação e da resposta. Por exemplo, em um link de 1 MB / s, uma carga útil de 100 KB levaria 100ms extras para transportar.
Dustin Boswell
7

O tempo de ping é de ida e volta. Se você pensar sobre isso - como poderia medir o tempo de ida? Por isso, serão necessários 30 ms mais o tempo de consulta.

David Schwartz
fonte
11
Vou acrescentar que provavelmente vai demorar um pouco mais do que apenas os 30 segundos + tempo de consulta. desde Ping é ICMP e sua conexão DB é TCP, você também terá que setup / aperto de mão, e DB iniciação Connection etc lá também
Doon
@Doon: O que poderia ser "evitadas" com conexões persistentes TCP / banco de dados
Michuelnik
@ Micheluelnik, você acha que a conexão persistente com o banco de dados é o caminho a seguir aqui? Isso causará outros problemas?
Phil
@michuelnik, é claro. Apenas estava apontando que não é tão simples quanto o RTT + Query. Há também limites para Max velocidade, por sessão devido à latência, etc ..)
Doon
@phil Na maioria dos casos, as conexões de banco de dados persistentes são benéficas, se você estiver fazendo várias consultas. Se as consultas são espalhadas / esporádicas, você está vinculando recursos desnecessariamente, mas se as consultas estão surgindo o tempo todo, etc., você economizará uma quantidade não trivial de sobrecarga, reutilizando a conexão existente, em vez de abrir uma nova em cada solicitação.
Doon