ข้อมูลที่ได้จากการ ping: มันไปกลับหรือทางเดียว?


28

ฉันมีเซิร์ฟเวอร์ 2 เครื่องแต่ละแห่งแยกกันสองแห่ง ฉันต้องการโฮสต์แอปพลิเคชั่นหนึ่งและเซิร์ฟเวอร์ฐานข้อมูลอีกอันหนึ่ง

จากแอพเซิร์ฟเวอร์ถ้าฉัน ping เซิร์ฟเวอร์ฐานข้อมูลโดยเฉลี่ยฉันจะได้รับประมาณ 30 มิลลิวินาที

คำถามของฉันคือ:

When I query the database from the app;

เป็นไปได้ไหม 30 ms + database_server_query_run_time

หรือ;

มันจะใช้เวลา30 ms + database_server_query_run_time+ 30ms

ฉันอยากจะเข้าใจสิ่งนี้โปรด

คำตอบ:


24

โดยปกติจะใช้เวลามากกว่าสองตัวเลือก

Ping วัดเวลาจากลูกค้าไปยังเซิร์ฟเวอร์และกลับมาอีกครั้ง (rtt - เวลาไปกลับ)

โดยปกติฐานข้อมูลจะใช้ TCP ดังนั้นคุณต้องส่งแพ็กเก็ต SYN ก่อนเพื่อเริ่มการจับมือ TCP (เพื่อลดความซับซ้อนสมมติว่าเวลา 15ms * + cpu จากนั้นคุณจะได้รับและ SYN / ACK (เวลา 15ms + cpu) ส่ง ACK และ a ร้องขอ (เวลาอย่างน้อย 15ms + cpu) จากนั้นเวลาสำหรับ DB เพื่อประมวลผลแบบสอบถามแล้วเวลา (15ms + cpu) เพื่อรับข้อมูลกลับมาและอีกเล็กน้อยเพื่อ ack และปิดการเชื่อมต่อ

นี่คือหลักสูตรที่ไม่นับการรับรองความถูกต้อง (ชื่อผู้ใช้ / รหัสผ่าน) ไปยังฐานข้อมูลและไม่มีการเข้ารหัส (ssl handshakes / DH หรืออะไรก็ตามที่จำเป็น)

* ครึ่งหนึ่งของเวลาไปกลับสมมติว่าเส้นทางไปและกลับมีความสมมาตร (ครึ่งเวลาที่ไปที่นั่นและอีกครึ่งเพื่อกลับ ... เวลาประมวลผล cpu สำหรับการตอบกลับ ping สั้นมาก)


ปัญหาของการจับมือสามทางสามารถพบได้กับเซสชัน TCP ถาวร
Michuelnik

@Michuelnik คุณช่วยอธิบายเพิ่มเติมได้ไหม? ฉันอยากจะเข้าใจสิ่งทั้งหมดนี้และหาวิธีที่ดีที่สุดในการลดเวลาแฝงในการค้นหา DB
ฟิล

2
น่าเศร้าที่ซอฟต์แวร์ส่วนใหญ่ (อย่างน้อยเว็บแอป) ไม่รองรับสิ่งนี้: / แต่แนวคิดก็คือเพื่อสร้างการเชื่อมต่อ (หนึ่งครั้ง) ไปยังฐานข้อมูลและทำให้การเชื่อมต่อนั้นเปิดอยู่ (เปิด) และเพียงส่งแบบสอบถาม / รับการตอบกลับมากกว่าหนึ่งครั้ง การเชื่อมต่อเปิดอย่างต่อเนื่อง สิ่งนี้ช่วยลดความจำเป็นในการจับมือ tcp, การรับรองความถูกต้องและอื่น ๆ ในแต่ละครั้ง
mulaz

mulaz ขอบคุณสำหรับการอธิบาย ฉันจะทำงานกับ Python ดังนั้นเราจะมาดูกันว่ามันจะเป็นอย่างไร ;-)
ฟิล

อย่าลืมขนาดของคำขอและคำตอบ ตัวอย่างเช่นผ่านลิงก์ขนาด 1MB / วินาที payload 100KB จะใช้เวลา 100ms พิเศษในการขนส่ง
ดัสตินบอสเวล

7

เวลาปิงคือไปกลับ หากคุณคิดเกี่ยวกับมัน - จะวัดได้ครั้งเดียวได้อย่างไร? ดังนั้นจะใช้เวลา 30ms รวมทั้งเวลาสอบถาม


1
ฉันจะเพิ่มที่อาจจะใช้เวลานานกว่าเพียงแค่เวลา 30 วินาที + แบบสอบถาม เนื่องจาก Ping เป็น ICMP และการเชื่อมต่อฐานข้อมูลของคุณเป็น TCP คุณจะมีการตั้งค่า / จับมือและการเริ่มต้นการเชื่อมต่อฐานข้อมูลเป็นต้นที่นั่นเช่นกัน
Doon

@ Doon: ซึ่งสามารถ "หลีกเลี่ยง" ด้วยการเชื่อมต่อ TCP / ฐานข้อมูลแบบถาวร
Michuelnik

@Michuelnik คุณคิดว่าการเชื่อมต่อฐานข้อมูลถาวรเป็นวิธีที่จะไปที่นี่หรือไม่ มันจะทำให้เกิดปัญหาอื่น ๆ บ้างไหม?
ฟิล

@michuelnik แน่นอน เพียงชี้ให้เห็นว่ามันไม่ง่ายเหมือน RTT + Query นอกจากนี้ยังมีการ จำกัด ความเร็วสูงสุดต่อเซสชันเนื่องจากเวลาในการตอบสนอง ฯลฯ )
Doon

@phil ในกรณีส่วนใหญ่การเชื่อมต่อฐานข้อมูลแบบถาวรจะเป็นประโยชน์หากคุณกำลังจะทำการสืบค้นหลายครั้ง หากข้อความค้นหาแพร่กระจาย / เป็นระยะ ๆ คุณกำลังคาดหวังทรัพยากรโดยไม่จำเป็น แต่ถ้าข้อความค้นหามาตลอดเวลา ฯลฯ คุณจะบันทึกจำนวนค่าใช้จ่ายที่ไม่น่ารำคาญด้วยการใช้การเชื่อมต่อที่มีอยู่แทนการเปิดใหม่ในแต่ละคำขอ
Doon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.