ช่องว่างประสิทธิภาพของ Windows Named Pipes ถูกเปิดเผยในการพัฒนาข้ามแพลตฟอร์ม

ทีมชุมชน BigGo
ช่องว่างประสิทธิภาพของ Windows Named Pipes ถูกเปิดเผยในการพัฒนาข้ามแพลตฟอร์ม

การสนทนาล่าสุดเกี่ยวกับการปรับปรุงประสิทธิภาพ pipe ใน Linux ได้เปิดเผยความแตกต่างด้านประสิทธิภาพที่สำคัญระหว่างระบบปฏิบัติการต่างๆ โดยเฉพาะอย่างยิ่งเน้นย้ำถึงประสิทธิภาพที่แย่ของ Windows กับ named pipes เมื่อเปรียบเทียบกับการใช้งานใน Linux การสนทนานี้เกิดขึ้นจากนักพัฒนาที่แบ่งปันประสบการณ์การย้ายแอปพลิเคชันข้ามแพลตฟอร์ม

ความประหลาดใจด้านประสิทธิภาพข้ามแพลตฟอร์ม

การเปิดเผยที่น่าประทับใจที่สุดมาจากนักพัฒนาที่พยายามย้ายแอปพลิเคชันที่ใช้ pipe ใน Linux ไปยัง Windows โดยคาดหวังประสิทธิภาพที่คล้ายคลึงกันเนื่องจากความเข้ากันได้ของ POSIX แต่ความเป็นจริงกลับแตกต่างไปจากนั้นอย่างมาก นักพัฒนาคนหนึ่งบรรยายประสบการณ์นี้ว่ามีประสิทธิภาพที่แย่มาก โดยค้นพบว่าการมี spare listening pipes ที่รอการเชื่อมต่ออยู่อาจส่งผลกระทบอย่างรุนแรงต่อประสิทธิภาพของระบบ Windows

ปัญหาไม่ได้จำกัดอยู่แค่ความเร็วในการถ่ายโอนข้อมูล Windows ดูเหมือนจะมีปัญหากับการจัดการ pipe ขั้นพื้นฐาน โดยนักพัฒนาพบว่าการลดจำนวน idle listening pipes ให้การปรับปรุงประสิทธิภาพที่ดีที่สุด แม้แต่การมีการเชื่อมต่อสำรองเพียง 8-12 รายการที่พร้อมใช้งานก็ทำให้ระบบช้าลงอย่างเห็นได้ชัด ซึ่งบ่งบอกว่า Windows กำลัง busy-waiting สำหรับการเชื่อมต่อใหม่ภายใน

หมายเหตุ: Named pipes เป็นรูปแบบหนึ่งของการสื่อสารระหว่างกระบวนการที่ช่วยให้สามารถแลกเปลี่ยนข้อมูลระหว่างโปรแกรมต่างๆ ที่ทำงานบนระบบเดียวกัน

การเปรียบเทียบประสิทธิภาพตามแพลตฟอร์ม:

  • Linux: 1.5+ GiB/s ด้วย standard pipes และสูงกว่านี้มากด้วย splice()
  • Windows: ประสิทธิภาพต่ำกว่ามาก โดยเฉพาะเมื่อมีการเชื่อมต่อที่รอคอยหลายตัว
  • ทางเลือก: Local TCP บน Windows มักจะมีประสิทธิภาพดีกว่า native pipes
  • ผลกระทบ: การมี 8-12 spare listening pipes สามารถทำให้เกิดการชะลอตัวของระบบทั้งหมดบน Windows

โซลูชันทางเลือกและวิธีแก้ไขปัญหา

การสนทนาในชุมชนเปิดเผยโซลูชันที่เป็นไปได้หลายแบบสำหรับปัญหาประสิทธิภาพของ Windows การเชื่อมต่อ TCP ในเครื่องมักจะมีประสิทธิภาพเหนือกว่า Windows pipes อย่างมีนัยสำคัญ ทำให้เป็นทางเลือกที่เป็นไปได้สำหรับแอปพลิเคชันข้ามแพลตฟอร์ม การเพิ่ม AF_UNIX sockets ของ Microsoft ใน Windows เสนอทางเลือกอื่น แม้ว่าการปรับปรุงประสิทธิภาพจะดูเหมือนเล็กน้อยเมื่อเปรียบเทียบกับความแตกต่างอย่างมากที่เห็นกับ traditional pipes

สำหรับนักพัฒนาที่ต้องการประสิทธิภาพสูงสุดบน Linux การสนทนาเน้นย้ำเทคนิคขั้นสูงอย่าง splice() system calls ซึ่งช่วยให้สามารถถ่ายโอนข้อมูลแบบ zero-copy ระหว่าง pipes และ sockets อย่างไรก็ตาม การปรับปรุงเฉพาะ Linux เหล่านี้ไม่สามารถใช้ได้บนแพลตฟอร์มอื่น ทำให้เกิดความท้าทายเพิ่มเติมสำหรับการพัฒนาข้ามแพลตฟอร์ม

เทคนิค Pipe ขั้นสูงของ Linux:

  • splice(): การถ่ายโอนแบบ zero-copy ระหว่าง pipes และ sockets (เฉพาะ Linux เท่านั้น)
  • readv()/writev(): Vectored I/O เพื่อประสิทธิภาพที่ดีขึ้น
  • sendfile(): การถ่ายโอนแบบ zero-copy จากไฟล์ไปยัง socket
  • io_uring: อินเทอร์เฟซ asynchronous I/O สมัยใหม่
  • Shared memory: ตัวเลือกที่เร็วที่สุดสำหรับการสื่อสารระหว่างโปรเซส
ภาพประกอบของ "pipe ring" ที่แสดงถึงวิธีการจัดระเบียบและถ่ายโอนข้อมูลในการสื่อสารระหว่างกระบวนการ ซึ่งเกี่ยวข้องกับทางเลือกในการปรับปรุงประสิทธิภาพในแอปพลิเคชันข้ามแพลตฟอร์ม
ภาพประกอบของ "pipe ring" ที่แสดงถึงวิธีการจัดระเบียบและถ่ายโอนข้อมูลในการสื่อสารระหว่างกระบวนการ ซึ่งเกี่ยวข้องกับทางเลือกในการปรับปรุงประสิทธิภาพในแอปพลิเคชันข้ามแพลตฟอร์ม

ความเป็นจริงของมาตรฐาน POSIX

การสนทนาเน้นย้ำถึงความแตกต่างที่สำคัญระหว่างการปฏิบัติตามมาตรฐานและความคาดหวังด้านประสิทธิภาพ แม้ว่า POSIX จะกำหนดพฤติกรรมและความเข้ากันได้ แต่ไม่ได้รับประกันลักษณะด้านประสิทธิภาพ ระบบปฏิบัติการแต่ละตัวใช้มาตรฐานเหล่านี้แตกต่างกัน ทำให้เกิดโปรไฟล์ประสิทธิภาพที่แตกต่างกันอย่างมากแม้ในขณะที่ใช้โค้ดเดียวกัน

POSIX กำหนดเพียงพฤติกรรมเท่านั้น ไม่ใช่ประสิทธิภาพ แพลตฟอร์มและระบบปฏิบัติการแต่ละตัวจะมีลักษณะเฉพาะด้านประสิทธิภาพของตัวเอง

ความเป็นจริงนี้บังคับให้นักพัฒนาต้องเลือกอย่างยากลำบากระหว่างการพกพาโค้ดและประสิทธิภาพที่เหมาะสมที่สุด มักต้องการการปรับปรุงเฉพาะแพลตฟอร์มเพื่อให้ได้ผลลัพธ์ที่ยอมรับได้ในระบบปฏิบัติการต่างๆ

มองไปข้างหน้า

ช่องว่างประสิทธิภาพระหว่าง Windows และ Linux สำหรับการดำเนินการ pipe ยังคงเป็นข้อพิจารณาที่สำคัญสำหรับการพัฒนาข้ามแพลตฟอร์ม แม้ว่า Windows จะมีการปรับปรุงเมื่อเวลาผ่านไป รวมถึงประสิทธิภาพที่ดีขึ้นใน Windows 10 และการเพิ่ม Unix domain sockets แต่ความแตกต่างที่สำคัญยังคงอยู่ นักพัฒนาที่ทำงานกับแอปพลิเคชันที่ต้องการประสิทธิภาพสูงอาจต้องพิจารณาวิธีการสื่อสารทางเลือกหรือใช้การปรับปรุงเฉพาะแพลตฟอร์มเพื่อให้ได้ประสิทธิภาพที่สม่ำเสมอในระบบปฏิบัติการต่างๆ

อ้างอิง: How fast are Linux pipes anyway?