Dữ liệu thu được từ ping: là chuyến đi khứ hồi hay một chiều?


28

Tôi có 2 máy chủ, mỗi máy chủ ở hai địa điểm riêng biệt. Tôi cần lưu trữ một ứng dụng trên một và máy chủ cơ sở dữ liệu khác.

Từ máy chủ ứng dụng, nếu tôi ping máy chủ cơ sở dữ liệu, trung bình tôi nhận được khoảng 30ms.

Câu hỏi của tôi là:

When I query the database from the app;

Nó sẽ lấy 30 ms + database_server_query_run_time

Hoặc là;

Nó sẽ mất hơn 30 ms + database_server_query_run_time30ms

Tôi muốn hiểu điều này xin vui lòng.

Câu trả lời:


24

Nó thường sẽ mất nhiều hơn sau đó hai lựa chọn.

Ping chỉ đo thời gian từ máy khách, đến máy chủ và quay lại (rtt - thời gian khứ hồi)

Thông thường cơ sở dữ liệu sử dụng TCP, vì vậy trước tiên bạn cần gửi gói SYN để bắt đầu bắt tay TCP (để đơn giản hóa thời gian cpu 15ms * +, sau đó bạn nhận và SYN / ACK (thời gian 15ms + cpu), gửi lại ACK và a yêu cầu (ít nhất 15ms + thời gian cpu), sau đó là thời gian để DB xử lý truy vấn và sau đó là thời gian (15ms + cpu) để lấy lại dữ liệu và thêm một chút để ack và đóng kết nối.

Đây là lý do không tính xác thực (tên người dùng / mật khẩu) cho cơ sở dữ liệu và không mã hóa (bắt tay ssl / DH hoặc bất cứ điều gì cần thiết).

* một nửa thời gian khứ hồi, giả sử tuyến đường ở đó và ngược lại là đối xứng (một nửa thời gian để đến đó và một nửa để quay lại ... thời gian xử lý cpu cho phản hồi ping là rất ngắn)


Vấn đề bắt tay ba chiều có thể gặp phải với các phiên TCP liên tục.
Michuelnik

@Michuelnik, bạn có thể giải thích rõ hơn không? Tôi thực sự muốn hiểu toàn bộ điều này và tìm cách tốt nhất để giảm thiểu độ trễ cho truy vấn DB.
Phil

2
Đáng buồn thay, hầu hết các phần mềm (ứng dụng web ít nhất) không hỗ trợ điều này: / Nhưng ý tưởng là, để thiết lập kết nối (một lần) với DB và giữ kết nối chạy (mở) và chỉ tiếp tục gửi truy vấn / nhận trả lời qua một, kết nối liên tục mở. Điều này giúp loại bỏ sự cần thiết của bắt tay tcp, xác thực, vv mỗi lần.
mulaz

mulaz, cảm ơn bạn đã giải thích. Tôi sẽ làm việc với Python để chúng tôi sẽ xem nó hoạt động như thế nào. ;-)
Phil

Đừng quên kích thước của yêu cầu và trả lời. Ví dụ: qua liên kết 1MB / giây, tải trọng 100KB sẽ mất thêm 100ms để vận chuyển.
Dustin Boswell

7

Thời gian ping là chuyến đi khứ hồi. Nếu bạn nghĩ về nó - làm thế nào nó có thể đo thời gian một chiều? Vì vậy, sẽ mất 30ms cộng với thời gian truy vấn.


1
Tôi sẽ chỉ thêm rằng có lẽ sẽ mất nhiều thời gian hơn chỉ 30 giây + thời gian truy vấn. vì Ping là ICMP và kết nối DB của bạn là TCP, bạn cũng sẽ có thiết lập / bắt tay và bắt đầu Kết nối DB, v.v.
Doon

@Doon: Điều này có thể được "tránh" với các kết nối cơ sở dữ liệu / TCP liên tục
Michuelnik

@Michuelnik, bạn có nghĩ rằng kết nối DB liên tục là cách để đi đến đây không? Nó sẽ gây ra một số vấn đề khác?
Phil

@michuelnik, tất nhiên. Đã chỉ ra rằng nó không đơn giản như RTT + Query. Ngoài ra còn có Giới hạn cho Tốc độ tối đa, mỗi phiên do độ trễ, v.v.)
Doon

@phil Trong hầu hết các trường hợp, các kết nối DB liên tục có lợi, nếu bạn định thực hiện nhiều truy vấn. Nếu các truy vấn được trải ra / lẻ tẻ, bạn đang sử dụng các tài nguyên một cách không cần thiết, nhưng nếu các truy vấn luôn xuất hiện, v.v. bạn sẽ tiết kiệm được một lượng chi phí không đáng kể bằng cách sử dụng lại kết nối hiện tại thay vì mở một kết nối mới cho mỗi yêu cầu.
Doon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.