การเชื่อมต่อ TCP loopback เทียบกับประสิทธิภาพของ Unix Domain Socket


116

ทำงานบนแอปพลิเคชันที่ใช้ Android และ iOS ซึ่งต้องการการสื่อสารกับเซิร์ฟเวอร์ที่ทำงานในอุปกรณ์เดียวกัน ปัจจุบันใช้การเชื่อมต่อ TCP loopback สำหรับการสื่อสารกับแอพและเซิร์ฟเวอร์ (แอพที่เขียนในเลเยอร์ผู้ใช้เซิร์ฟเวอร์ที่เขียนด้วย C ++ โดยใช้ Android NDK)

ฉันสงสัยว่าการแทนที่การสื่อสารระหว่างกันด้วยซ็อกเก็ต Unix Domain จะช่วยเพิ่มประสิทธิภาพได้หรือไม่?

หรือโดยทั่วไปมีหลักฐาน / ทฤษฎีใดที่พิสูจน์ได้ว่าซ็อกเก็ต Unix Domain จะให้ประสิทธิภาพที่ดีกว่าการเชื่อมต่อ TCP loopback หรือไม่?


3
โปรดจำไว้ว่าโลคัลซ็อกเก็ต (ซ็อกเก็ตโดเมน UNIX) ต้องการไฟล์ในระบบไฟล์ การใช้ที่อยู่ลูปแบ็ค TCP จะเก็บข้อมูลทั้งหมดไว้ในหน่วยความจำ และถ้าคุณต้องใช้ซ็อกเก็ต TCP ระยะไกลอาจเป็นการง่ายกว่าที่จะรวมซ็อกเก็ต TCP อื่นแทนการเล่นซอกับซ็อกเก็ตใหม่และตระกูลแอดเดรส
เพื่อนโปรแกรมเมอร์บางคน

1
@JoachimPileborg เมื่อพัฒนาเฉพาะสำหรับ Linux (Android) มีตัวเลือกในการใช้ที่อยู่ซ็อกเก็ตโดเมน UNIX แบบนามธรรมซึ่งไม่จำเป็นต้องมีไฟล์ในระบบไฟล์
thuovila

อ้างอิงstackoverflow.com/questions/14643571/…สำหรับการเชื่อมต่อ Android
Rohit

8
@Someprogrammerdude พวกเขาต้องการไฟล์ในระบบไฟล์ แต่นั่นไม่ได้หมายความว่าทุกอย่างจะไปที่ดิสก์และย้อนกลับ
Marquis of Lorne

3
@Someprogrammerdude เฉพาะชื่อไฟล์ความเป็นเจ้าของและข้อมูลสิทธิ์เท่านั้นที่เคยถูกเก็บไว้ในระบบไฟล์ การถ่ายโอนข้อมูลจริงทั้งหมดเกิดขึ้นในหน่วยความจำทั้งหมด
Jesin

คำตอบ:


105

ใช่การสื่อสารระหว่างประเทศโดยการซ็อกเก็ตโดเมนยูนิกซ์ควรจะเร็วกว่าการสื่อสารโดยการเชื่อมต่อย้อนกลับ localhost เพราะคุณมีน้อย TCP ค่าใช้จ่ายให้ดูที่นี่


12
ลิงก์แรกอ้างถึงลิงก์ที่สองซึ่งมาจากปี 2548 (เก่า) และครอบคลุมเฉพาะ FreeBSD
Janus Troelsen

7
คำตอบนี้ไม่ถูกต้องเมื่อทดสอบลูปแบ็ค tcp บนลินุกซ์รุ่นใหม่เร็วและเร็วกว่า UDS ในบางครั้ง สามารถให้เกณฑ์มาตรฐานได้หากจำเป็น
easytiger

10
คำตอบนี้ถูกต้องอย่างยิ่ง อินเทอร์เฟซ Loopback ยังคงเป็น TCP ซึ่งหมายความว่าคุณยังมีค่าใช้จ่ายของ TCP (การควบคุมความแออัดการควบคุมการไหลการจัดการสตรีม (การจัดลำดับแพ็กเก็ต IP การส่งซ้ำ ฯลฯ )) ซ็อกเก็ตของโดเมน Unix ไม่ได้ทำสิ่งใด ๆ ข้างต้นเนื่องจากได้รับการออกแบบมาตั้งแต่ต้นเพื่อให้ทำงานในพื้นที่ได้หมายความว่าไม่มีปัญหาความแออัดไม่มีความแตกต่างด้านความเร็วระหว่างเซิร์ฟเวอร์ / ไคลเอนต์ที่ต้องการการควบคุมการไหลไม่มีแพ็กเก็ตตกหล่น ฯลฯ Google หากมีข้อสงสัย ไม่ใช่สิ่งใหม่
JSON

4
แล้ว UDP ท้องถิ่นล่ะ?
CMCDragonkai

2
เนื่องจากลิงก์แรกตาย (HTTP 404) ... นี่คือเหตุผลที่แนวทางปฏิบัติที่ดีที่สุดของ stackoverflow อย่างน้อยที่สุดก็คือให้คำพูดที่เกี่ยวข้องสั้น ๆ / กระชับจาก URL ต้นทางในขณะที่เขียนคำตอบ (จากนั้นเมื่อลิงก์ลงไป สรุปสั้น ๆ ยังมีอยู่)
Trevor Boyd Smith

80

เกณฑ์มาตรฐานนี้: https://github.com/rigtorp/ipc-bench มีการทดสอบเวลาแฝงและปริมาณงานสำหรับซ็อกเก็ต TCP, Unix Domain Sockets (UDS) และ PIPE

Here you have the results on a single CPU 3.3GHz Linux machine :

TCP average latency: 6 us

UDS average latency: 2 us

PIPE average latency: 2 us

TCP average throughput: 0.253702 million msg/s

UDS average throughput: 1.733874 million msg/s

PIPE average throughput: 1.682796 million msg/s

การลดเวลาแฝง 66%และปริมาณงานเพิ่มขึ้นเกือบ 7 เท่าอธิบายว่าเหตุใดซอฟต์แวร์ที่มีความสำคัญต่อประสิทธิภาพส่วนใหญ่จึงมีโปรโตคอลที่กำหนดเอง IPC ของตัวเอง


7
สำหรับฉันดูเหมือนว่าผลิตภัณฑ์ของพวกเขาคือคำตอบสำหรับปัญหา! นั่นอาจเป็นเหตุผลว่าทำไมพวกเขาถึงตอบคำถามเหล่านั้น เพราะพวกเขารู้คำตอบ
GreenReaper

นี่เป็นคำตอบที่ยอดเยี่ยมเพราะมันมีตัวเลขบางอย่าง ทรูพุตจาก TCP ไป UNIX ดีกว่า 350% UNIX ถึง PIPE 40% บน i5
ScalaWilliam

13
@GreenReaper คำตอบนั้นเกี่ยวข้องจริง ๆ แต่ผลิตภัณฑ์ Torusware Speedus ของเรา ... มาพร้อมกับ 2 เวอร์ชัน Speedus Lite และ Speedus Extreme Performance (EP)ไม่ใช่และทำให้ทุกอย่างดูเหมือนโฆษณาราคาถูก
Dmitry Grigoryev

3
สแปม และไม่ผลิตภัณฑ์ของเขาไม่เกี่ยวข้องกับการเปรียบเทียบระหว่างซ็อกเก็ต TCP และ Unix มีทางเลือกสามัญสำนึกมากมายสำหรับซ็อกเก็ต - แต่ละรายการนอกสิ่งที่ OP กำลังถาม
JSON

ยังไม่มีการอธิบายการใช้เครื่องมือนั้นอย่างเพียงพอ มีหน้าอธิบายวิธีการเรียกไคลเอนต์และเซิร์ฟเวอร์หรือไม่?
falkb

40

เกณฑ์มาตรฐาน Redis แสดงให้เห็นว่าซ็อกเก็ตโดเมน unix สามารถเร็วกว่า TCP loopback อย่างมีนัยสำคัญ

เมื่อโปรแกรมเปรียบเทียบเซิร์ฟเวอร์และไคลเอ็นต์ทำงานบนกล่องเดียวกันสามารถใช้ทั้งซ็อกเก็ตโดเมน TCP / IP loopback และ unix ซ็อกเก็ตโดเมน unix สามารถรับปริมาณงานได้มากกว่า TCP / IP loopback โดยขึ้นอยู่กับแพลตฟอร์ม (เช่นบน Linux) พฤติกรรมเริ่มต้นของ redis-benchmark คือการใช้ TCP / IP loopback

อย่างไรก็ตามความแตกต่างนี้มีความสำคัญก็ต่อเมื่อปริมาณงานสูง

ปริมาณงานต่อขนาดข้อมูล


8

ซ็อกเก็ตโดเมน Unix มักจะเร็วเป็นสองเท่าของซ็อกเก็ต TCP เมื่อเพียร์ทั้งสองอยู่บนโฮสต์เดียวกัน โปรโตคอลโดเมน Unix ไม่ใช่ชุดโปรโตคอลจริง แต่เป็นวิธีการสื่อสารไคลเอ็นต์ / เซิร์ฟเวอร์บนโฮสต์เดียวโดยใช้ API เดียวกับที่ใช้สำหรับไคลเอ็นต์และเซิร์ฟเวอร์บนโฮสต์ที่แตกต่างกัน โปรโตคอลโดเมน Unix เป็นอีกทางเลือกหนึ่งของวิธีการสื่อสารระหว่างกระบวนการ (IPC)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.