Cải thiện độ ổn định của ứng dụng khách Steam trên Linux
(ttimo.typepad.com)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
setenvvàgetenv. -
Vấn đề:
setenvlà 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ọigetenv, 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ằngexecvpe. - 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.
- Loại bỏ phần lớn các lệnh gọi
-
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
setenvthì 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
envpmà 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
Ý 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
getenvsẽ được đưa vào glibc 2.41setenvvốn đã dễ xử lý hơn vì không giải phóng chuỗi môi trườngunsetenvphức tạp do vấn đề đồng thờigetenvlà để giữ an toàn với tín hiệu bất đồng bộvfork+execveCả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
setenvgetenv/setenvnhư một cơ chế nhắn tin IPC có thể gây vấn đềCó thắc mắc liệu
setenvcó phải là Linux API hay khôngsetenvđược định nghĩa trong POSIX và được triển khai ở user space chứ không phải trong nhân LinuxCó 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ôngCó vấn đề Steam phàn nàn rằng không có kết nối
Những hiểu biết về Steam client và lập trình Linux khá thú vị
Để giải quyết vấn đề trong glibc, có thể sẽ cần đánh đổi về tính năng
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