2 คะแนน โดย GN⁺ 2024-11-12 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ปรับปรุงเสถียรภาพของไคลเอนต์ 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 ความคิดเห็น

 
GN⁺ 2024-11-12
ความเห็นจาก Hacker News
  • กำลังพิจารณาแพตช์จากปัญหาความเสถียรของกราฟิกสแตกของ Red Hat

    • มีความเป็นไปได้สูงว่าการแก้ไขความปลอดภัยของเธรดใน getenv จะถูกรวมไว้ใน glibc 2.41
    • setenv จัดการได้ง่ายกว่าเพราะไม่ได้ปล่อยสตริงของ environment อยู่แล้ว
    • unsetenv ซับซ้อนเพราะมีปัญหาเรื่องการทำงานพร้อมกัน
    • เหตุผลที่ไม่อยากเพิ่มล็อกให้ getenv คือเพื่อคงความปลอดภัยต่อ asynchronous signal
    • เนื่องจาก vfork+execve ทำให้หลีกเลี่ยง memory leak ได้ยาก การแก้ไขการจัดการ environment จึงเป็นประเด็นถกเถียง
  • รู้สึกขอบคุณที่ Steam บน Linux ยังทำงานได้ดี

  • แนวทางที่ดีที่สุดคืออ่านตัวแปรสภาพแวดล้อมตอนบูตและไม่ใช้ setenv

    • เมื่อต้องสร้างโปรเซสใหม่ ควรคัดลอก environment ปัจจุบันแล้วอัปเดตค่าใหม่
    • การใช้ getenv/setenv เป็นกลไกส่งข้อความแบบ IPC อาจก่อปัญหาได้
  • มีคำถามว่า setenv เป็น Linux API หรือไม่

    • setenv ถูกกำหนดไว้ใน POSIX และถูกอิมพลีเมนต์ใน user space ไม่ใช่ใน Linux kernel
  • มีคำถามว่ามีกรณีที่โปรแกรมเรียก setenv ในเธรดหนึ่งแล้วต้องการให้มีผลในอีกเธรดหนึ่งหรือไม่

    • GLIBC มีเอกสารอธิบายฟังก์ชันอันตรายไว้ค่อนข้างดี จึงอาจเพิ่มการล็อก/การคัดลอกได้
  • มีปัญหาที่ Steam บ่นว่าไม่มีการเชื่อมต่อ

    • ถ้ากดปุ่ม 'ลองใหม่' หลายครั้งก็จะใช้งานได้ แต่ไม่สะดวก
  • มุมมองเกี่ยวกับ Steam client และการเขียนโปรแกรมบน Linux น่าสนใจ

    • เข้าใจได้ว่าทำไม release note ถึงไม่ละเอียด แต่คำว่า "แก้บั๊กการแครชทั่วไป" ดูเป็นการอธิบายน้อยเกินไป
  • การแก้ปัญหาใน glibc อาจต้องแลกกับความสามารถบางอย่าง

    • ถ้าระยะยาวสามารถเสนอแนวทางที่สมเหตุสมผลได้ ก็ควรเดินหน้าต่อ
  • ประสิทธิภาพการเรนเดอร์ของ Steam client แย่เมื่อเมาส์อยู่ภายในหน้าต่าง

  • มีบั๊กใน Linux Steam client ที่คงอยู่นานมาก

    • หากเปิด Steam ทิ้งไว้เกินหนึ่งวัน จะเกิดการขาดแคลน window handle จนไม่สามารถเปิดแอปกราฟิก/หน้าต่างใหม่ได้
    • หากใช้ Steam Chat ปัญหาจะเกิดเร็วขึ้น
    • ปัญหานี้มีการบันทึกไว้ใน GitHub แต่ถูกปิดโดยไม่มีเหตุผล
    • โดยส่วนตัวจึงรีสตาร์ต Steam ทุกวัน
    • พบปัญหานี้ทั้งบน KDE/Wayland และ X11