Данные, полученные из ping: это туда-обратно или в одну сторону?

28

У меня есть 2 сервера, каждый в двух разных местах. Мне нужно разместить приложение на одном, а сервер базы данных на другом.

С сервера приложений, если я пингую сервер базы данных, в среднем я получаю около 30 мс.

Мой вопрос:

When I query the database from the app;

Это займет 30 ms + database_server_query_run_time

Или;

Это займет 30 ms + database_server_query_run_time+ 30 мс

Я хотел бы понять это, пожалуйста.

Фил
источник

Ответы:

24

Обычно это займет больше, чем эти два варианта.

Ping измеряет только время от клиента до сервера и обратно (rtt - время прохождения в оба конца)

Обычно базы данных используют TCP, поэтому сначала необходимо отправить пакет SYN, чтобы запустить TCP-квитирование (для упрощения, скажем, 15 мс * + время процессора, затем вы получите и SYN / ACK (15 мс + время процессора), отправьте обратно ACK и запрос (по крайней мере, 15 мс + время процессора), затем время для обработки запроса БД, а затем время (15 мс + процессор), чтобы получить данные обратно, и еще немного, чтобы подтвердить и закрыть соединение.

Это, конечно, не считая аутентификацию (имя пользователя / пароль) для базы данных, и не шифрование (ssl handshakes / DH или что-то еще нужно).

* половина времени туда и обратно, при условии, что маршрут туда и обратно симметричен (половина времени, чтобы добраться туда, и половина, чтобы вернуться ... время обработки ЦП для ответа пинга очень короткое)

mulaz
источник
Проблема трехстороннего рукопожатия может возникнуть при постоянных сеансах TCP.
Мишельник,
@Michuelnik, не могли бы вы уточнить? Я действительно хотел бы понять все это и найти лучший способ минимизировать время ожидания для запросов к БД.
Фил
2
К сожалению, большинство программ (по крайней мере, веб-приложений) не поддерживают это: / Но идея состоит в том, чтобы установить соединение (один раз) с БД и поддерживать соединение работающим (открытым), и просто продолжать отправлять запросы / получать ответы по одному, постоянно открытое соединение. Это исключает необходимость каждый раз принимать рукопожатия, аутентификацию и т. Д.
Мулаз
Мулаз, спасибо за объяснение. Я буду работать с Python, поэтому посмотрим, как оно пойдет. ;-)
Фил
Не забудьте размер запроса и ответа. Например, для канала со скоростью 1 МБ / с полезная нагрузка в 100 КБ потребует дополнительных 100 мс для транспортировки.
Дастин Босвелл
7

Время пинга в оба конца. Если вы думаете об этом - как это может измерить одностороннее время? Так что это займет 30 мс плюс время запроса.

Дэвид Шварц
источник
1
Я просто добавлю, что это может занять немного больше времени, чем 30 секунд + время запроса. Так как Ping - это ICMP, а ваше соединение с БД - TCP, у вас также будет настройка / рукопожатие, инициализация соединения с БД и т. д.
Doon
@ Doon: Чего можно было бы «избежать» при постоянных соединениях TCP / базы данных
Мишельник
@Michuelnik, ты думаешь, что постоянное соединение с БД - это путь сюда? Это вызовет некоторые другие проблемы?
Фил
@michuelnik, конечно. Просто указывал, что это не так просто, как RTT + Query. Существуют также ограничения максимальной скорости на сеанс из-за задержки и т. Д.)
Doon
@phil В большинстве случаев постоянные соединения с БД полезны, если вы собираетесь делать несколько запросов. Если запросы распределяются / спорадически, вы излишне связываете ресурсы, но если запросы приходят постоянно и т. Д., Вы сэкономите нетривиальные издержки, повторно используя существующее соединение, а не открывая новое при каждом запросе.
Doon