Дані, отримані з 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 (щоб спростити, скажімо, час 15ms * + cpu, потім ви отримаєте SYN / ACK (15ms + cpu time), відправте назад ACK і запит (принаймні 15 мс + час процесора), потім час для БД на обробку запиту, а потім час (15 мс + процесор) для повернення даних, а також трохи більше, щоб підключити і закрити з'єднання.

Звичайно, це не враховує автентифікацію (ім'я користувача / пароль) до бази даних, а також не шифрування (ssl рукостискання / DH або все, що потрібно).

* половина часу подорожі в обидва кінці, якщо припустити, що маршрут туди і назад є симетричним (половина часу дістатися туди, а половина повернутися назад ... Час обробки процесора для відповіді на ping дуже короткий)


Проблема тристороннього рукостискання може виникнути при постійних сеансах TCP.
Мічуельник

@Michuelnik, ви можете, будь ласка, докладно? Я дуже хотів би зрозуміти це все і знайти найкращий спосіб мінімізувати затримку для запиту БД.
Філ

2
На жаль, більшість програмного забезпечення (принаймні веб-додатків) не підтримують це: / Але ідея полягає в тому, щоб встановити з'єднання (один раз) до БД, і тримати з'єднання запущеним (відкритим), і просто продовжувати надсилати запити / отримувати відповіді по одному, постійно відкритий зв'язок. Це виключає потребу в рукостисканні tcp, аутентифікації тощо.
мулаз

мулаз, дякую за пояснення. Я буду працювати з Python, щоб ми побачили, як це відбувається. ;-)
Філ

Не забудьте розмір запиту та відповіді. Наприклад, через 1 МБ / сек посилання, навантаження на 100 КБ потребує додаткових 100 мс для перевезення.
Дастін Босуелл

7

Час пінг - туди і назад. Якщо ви подумаєте над цим - як це можна було виміряти в один бік? Значить, це займе 30 мс плюс час запиту.


1
Я просто додам, що це, ймовірно, займе трохи більше часу, ніж лише 30 секунд + час запиту. оскільки Ping - це ICMP, а з'єднання з вами DB - це TCP, ви також матимете налаштування / рукостискання та ініціацію з’єднання БД тощо.
Doon

@Doon: чого можна було б уникнути за допомогою стійких підключень TCP / бази даних
Michuelnik

@Michuelnik, ти вважаєш, що стійке з'єднання БД - це спосіб перейти сюди? Чи це спричинить якісь інші проблеми?
Філ

@michuelnik, звичайно. Просто вказував, що це не так просто, як RTT + Query. Також є обмеження на максимальну швидкість, за сеанс через затримку тощо)
Doon

@phil У більшості випадків стійкі з'єднання БД вигідні, якщо ви збираєтеся робити кілька запитів. Якщо запити розповсюджуються / спорадично, ви необгрунтовано зав'язуєте ресурси, але якщо запити надходять постійно і т. Д., Ви збережете нетривіальну кількість накладних витрат, повторно використовуючи існуюче з'єднання, на відміну від відкриття нового на кожен запит.
Дун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.