ปรับปรุงเสถียรภาพของไคลเอนต์ Steam บน Linux
(ttimo.typepad.com)ปรับปรุงเสถียรภาพของไคลเอนต์ Steam
-
เบื้องหลัง: ในการอัปเดตไคลเอนต์ Steam วันที่ 5 พฤศจิกายน ได้แก้ไขปัญหาแครชทั่วไปบน Linux โดยส่วนที่ส่งผลมากที่สุดคือการเปลี่ยนวิธีใช้งานฟังก์ชัน
setenvและgetenv -
ปัญหา:
setenvเป็น API ที่ไม่ปลอดภัยบน Linux และอาจก่อปัญหาเมื่อใช้ในสภาพแวดล้อมแบบมัลติเธรด หลังจากมีการเรียกgetenvก็อาจเกิดการแครชอย่าง SIGABRT จากเธรดอื่นได้ -
แนวทางแก้ไข:
- ลบการเรียก
setenvออกเกือบทั้งหมด และรีแฟกเตอร์ให้ส่ง environment ตอนสร้างโปรเซสด้วยexecvpe - แคชการเรียกเพื่อลดการพึ่งพา
getenv - สำหรับกรณีที่ยังต้องใช้
setenvได้มีการนำ 'ตัวจัดการ environment' มาใช้ โดยจองบัฟเฟอร์ค่าที่มีขนาดใหญ่พอไว้ล่วงหน้าตอนเริ่มต้น
- ลบการเรียก
-
ผลลัพธ์: การเปลี่ยนแปลงเหล่านี้ช่วยลดความถี่ของการเกิด SIGABRT ลงอย่างมาก อย่างไรก็ตาม นี่ยังไม่ใช่วิธีแก้ที่สมบูรณ์ และหากไลบรารีภายนอกเรียก
setenvก็ยังคงมีความเสี่ยงที่จะเกิดการแครชได้ -
แผนในอนาคต: ทางฝั่ง glibc กำลังศึกษาวิธีแก้ปัญหานี้โดยยังคงความปลอดภัยแบบ asynchronous signal safety พร้อมทั้งซิงก์กับการใช้
envpงานนี้มีความซับซ้อน แต่ในระยะยาวมีแผนจะเสนอแนวทางแก้ที่ไม่ออกนอกกรอบของข้อกำหนด POSIX
1 ความคิดเห็น
ความเห็นจาก Hacker News
กำลังพิจารณาแพตช์จากปัญหาความเสถียรของกราฟิกสแตกของ Red Hat
getenvจะถูกรวมไว้ใน glibc 2.41setenvจัดการได้ง่ายกว่าเพราะไม่ได้ปล่อยสตริงของ environment อยู่แล้วunsetenvซับซ้อนเพราะมีปัญหาเรื่องการทำงานพร้อมกันgetenvคือเพื่อคงความปลอดภัยต่อ asynchronous signalvfork+execveทำให้หลีกเลี่ยง memory leak ได้ยาก การแก้ไขการจัดการ environment จึงเป็นประเด็นถกเถียงรู้สึกขอบคุณที่ Steam บน Linux ยังทำงานได้ดี
แนวทางที่ดีที่สุดคืออ่านตัวแปรสภาพแวดล้อมตอนบูตและไม่ใช้
setenvgetenv/setenvเป็นกลไกส่งข้อความแบบ IPC อาจก่อปัญหาได้มีคำถามว่า
setenvเป็น Linux API หรือไม่setenvถูกกำหนดไว้ใน POSIX และถูกอิมพลีเมนต์ใน user space ไม่ใช่ใน Linux kernelมีคำถามว่ามีกรณีที่โปรแกรมเรียก
setenvในเธรดหนึ่งแล้วต้องการให้มีผลในอีกเธรดหนึ่งหรือไม่มีปัญหาที่ Steam บ่นว่าไม่มีการเชื่อมต่อ
มุมมองเกี่ยวกับ Steam client และการเขียนโปรแกรมบน Linux น่าสนใจ
การแก้ปัญหาใน glibc อาจต้องแลกกับความสามารถบางอย่าง
ประสิทธิภาพการเรนเดอร์ของ Steam client แย่เมื่อเมาส์อยู่ภายในหน้าต่าง
มีบั๊กใน Linux Steam client ที่คงอยู่นานมาก