Data diperoleh dari ping: apakah bolak-balik atau satu arah?

28

Saya memiliki 2 server, masing-masing di dua lokasi terpisah. Saya perlu meng-host aplikasi di satu, dan server database di sisi lain.

Dari server aplikasi, jika saya melakukan ping ke server database, rata-rata saya mendapatkan sekitar 30 ms.

Pertanyaanku adalah:

When I query the database from the app;

Apakah ini akan memakan waktu 30 ms + database_server_query_run_time

Atau;

Apakah butuh 30 ms + database_server_query_run_time30ms

Saya ingin memahami ini.

Phil
sumber

Jawaban:

24

Biasanya akan mengambil lebih dari dua opsi itu.

Ping mengukur waktu dari klien, ke server, dan kembali lagi (rtt - round trip time)

Biasanya database menggunakan TCP, jadi pertama-tama Anda perlu mengirim paket SYN untuk memulai jabat tangan TCP (untuk menyederhanakan katakanlah 15ms * + waktu cpu, maka Anda menerima dan SYN / ACK (15ms + waktu cpu), mengirim kembali ACK dan request (minimal 15ms + cpu time), lalu waktu bagi DB untuk memproses kueri, dan kemudian waktu (15ms + cpu) untuk mendapatkan data kembali, dan sedikit lagi untuk ack, dan tutup koneksi.

Ini tentu saja tidak termasuk otentikasi (nama pengguna / kata sandi) ke basis data, dan tidak ada enkripsi (ssl handshake / DH atau apapun yang diperlukan).

* setengah dari waktu perjalanan bolak-balik, dengan asumsi rute di sana dan kembali simetris (separuh waktu untuk sampai ke sana, dan setengah untuk kembali ... waktu pemrosesan cpu untuk balasan ping sangat singkat)

mulaz
sumber
Masalah three-way-handshake dapat ditemui dengan sesi TCP yang persisten.
Michuelnik
@Michuelnik, bisakah Anda menjelaskan? Saya benar-benar ingin memahami semua ini dan menemukan cara terbaik untuk meminimalkan latensi untuk meminta DB.
Phil
2
Sayangnya, sebagian besar perangkat lunak (minimal aplikasi web) tidak mendukung ini: / Tapi idenya adalah, untuk membuat koneksi (satu kali) ke DB, dan menjaga koneksi tetap berjalan (terbuka), dan terus mengirim pertanyaan / mendapatkan balasan lebih dari satu, koneksi terus menerus terbuka. Ini menghilangkan kebutuhan untuk jabat tangan tcp, otentikasi, dll. Setiap kali.
mulaz
mulaz, terima kasih telah menjelaskan. Saya akan bekerja dengan Python sehingga kita akan melihat bagaimana kelanjutannya. ;-)
Phil
Jangan lupa ukuran permintaan dan balasannya. Misalnya, melalui tautan 1MB / detik, muatan 100KB akan membutuhkan 100ms ekstra untuk diangkut.
Dustin Boswell
7

Waktu ping adalah pulang pergi. Jika Anda memikirkannya - bagaimana bisa mengukur waktu satu arah? Jadi itu akan memakan waktu 30 ms ditambah waktu permintaan.

David Schwartz
sumber
1
Saya hanya akan menambahkan bahwa mungkin akan memakan waktu sedikit lebih lama dari hanya 30 detik + waktu permintaan. karena Ping adalah ICMP dan koneksi DB Anda adalah TCP, Anda juga akan memiliki setup / jabat tangan, dan inisiasi Koneksi DB dll di sana juga
Doon
@Doon: Yang bisa "dihindari" dengan koneksi TCP / database yang persisten
Michuelnik
@Michuelnik, apakah Anda berpikir bahwa koneksi DB yang persisten adalah cara untuk pergi ke sini? Apakah akan menyebabkan beberapa masalah lain?
Phil
@michuelnik, tentu saja. Baru saja menunjukkan itu tidak sesederhana RTT + Query. Ada juga Batas untuk Kecepatan Maks, per sesi karena latensi, dll.)
Doon
@ phil Dalam kebanyakan kasus, koneksi DB yang persisten bermanfaat, jika Anda akan melakukan banyak pertanyaan. Jika kueri tersebar / sporadis Anda tidak perlu mengikat sumber daya, tetapi jika kueri datang sepanjang waktu, dll. Anda akan menghemat jumlah overhead yang tidak sepele dengan menggunakan kembali koneksi yang ada sebagai lawan membuka yang baru pada setiap permintaan.
Doon