2 điểm bởi GN⁺ 2024-11-12 | 1 bình luận | Chia sẻ qua WhatsApp

Cải thiện độ ổn định của ứng dụng khách Steam

  • Bối cảnh: Bản cập nhật ứng dụng khách Steam ngày 5 tháng 11 đã sửa một số lỗi crash phổ biến trên Linux. Trong đó, thay đổi có tác động lớn nhất là cách sử dụng các hàm setenvgetenv.

  • Vấn đề: setenv là một API không an toàn trên Linux và có thể gây ra sự cố khi dùng trong môi trường đa luồng. Sau khi gọi getenv, crash như SIGABRT có thể xảy ra từ luồng khác.

  • Giải pháp:

    • Loại bỏ phần lớn các lệnh gọi setenv, đồng thời refactor để truyền môi trường khi tạo tiến trình bằng execvpe.
    • Cache các lệnh gọi để giảm mức độ phụ thuộc vào getenv.
    • Với các trường hợp vẫn phải dùng setenv, đưa vào một 'trình quản lý môi trường' để cấp phát trước bộ đệm giá trị đủ lớn ngay từ lúc khởi động.
  • Kết quả: Những thay đổi này giúp giảm đáng kể tần suất xuất hiện SIGABRT. Tuy nhiên, đây vẫn chưa phải giải pháp hoàn hảo; nếu thư viện bên ngoài gọi setenv thì nguy cơ crash vẫn còn.

  • Kế hoạch tiếp theo: Phía glibc đang nghiên cứu cách giải quyết vấn đề này bằng phương thức đồng bộ với việc sử dụng envp mà vẫn duy trì tính an toàn tín hiệu bất đồng bộ. Công việc này khá phức tạp, nhưng về dài hạn họ dự định đề xuất một giải pháp trong phạm vi không đi chệch khỏi đặc tả POSIX.

1 bình luận

 
GN⁺ 2024-11-12
Ý kiến Hacker News
  • Một bản vá đang được xem xét do vấn đề về độ ổn định của graphics stack trên Red Hat

    • Khả năng cao bản sửa về tính an toàn luồng của getenv sẽ được đưa vào glibc 2.41
    • setenv vốn đã dễ xử lý hơn vì không giải phóng chuỗi môi trường
    • unsetenv phức tạp do vấn đề đồng thời
    • Lý do không muốn thêm khóa vào getenv là để giữ an toàn với tín hiệu bất đồng bộ
    • Việc sửa cách xử lý môi trường gây tranh cãi vì khó tránh rò rỉ bộ nhớ do vfork+execve
  • Cảm thấy biết ơn vì Steam hoạt động tốt trên Linux

  • Cách tốt nhất là đọc biến môi trường khi khởi động và không dùng setenv

    • Khi tạo tiến trình mới, nên sao chép môi trường hiện tại rồi cập nhật giá trị mới
    • Dùng getenv/setenv như một cơ chế nhắn tin IPC có thể gây vấn đề
  • Có thắc mắc liệu setenv có phải là Linux API hay không

    • setenv được định nghĩa trong POSIX và được triển khai ở user space chứ không phải trong nhân Linux
  • Có câu hỏi liệu có trường hợp chương trình gọi setenv ở một luồng và muốn luồng khác nhận hiệu lực hay không

    • GLIBC đã tài liệu hóa khá tốt các hàm nguy hiểm nên có thể bổ sung khóa/sao chép
  • Có vấn đề Steam phàn nàn rằng không có kết nối

    • Nhấn nút 'thử lại' nhiều lần thì vẫn chạy, nhưng khá bất tiện
  • Những hiểu biết về Steam client và lập trình Linux khá thú vị

    • Có thể hiểu vì sao release note không quá chi tiết, nhưng "sửa lỗi crash chung" là cách diễn đạt quá khiêm tốn
  • Để giải quyết vấn đề trong glibc, có thể sẽ cần đánh đổi về tính năng

    • Nếu về lâu dài có thể đưa ra đề xuất hợp lý thì đáng để theo đuổi
  • Hiệu năng render của Steam client trên Linux không tốt khi chuột nằm trong cửa sổ

  • Có một bug tồn tại rất lâu trên Steam for Linux

    • Nếu để Steam chạy hơn một ngày, sẽ bị thiếu window handle nên không thể mở ứng dụng/ cửa sổ đồ họa mới
    • Dùng Steam Chat thì vấn đề xảy ra nhanh hơn
    • Vấn đề này đã được ghi lại trên GitHub nhưng bị đóng mà không rõ lý do
    • Cá nhân họ phải khởi động lại Steam mỗi ngày
    • Họ cũng quan sát thấy vấn đề này trên KDE/Wayland và cả X11