2 poin oleh GN⁺ 2024-11-12 | 1 komentar | Bagikan ke WhatsApp

Peningkatan stabilitas klien Steam

  • Latar belakang: Pada pembaruan klien Steam tanggal 5 November, beberapa crash umum di Linux telah diperbaiki. Di antaranya, yang paling berdampak adalah perubahan cara penggunaan fungsi setenv dan getenv.

  • Masalah: setenv adalah API yang tidak aman di Linux, dan dapat menimbulkan masalah saat digunakan dalam lingkungan multithread. Setelah pemanggilan getenv, crash seperti SIGABRT dapat terjadi di thread lain.

  • Solusi:

    • Sebagian besar pemanggilan setenv dihapus, lalu direfaktor agar environment diteruskan saat pembuatan proses dengan menggunakan execvpe.
    • Pemanggilan di-cache untuk mengurangi ketergantungan pada getenv.
    • Untuk kasus penggunaan setenv yang tersisa, diperkenalkan 'manajer environment' yang mengalokasikan buffer nilai yang cukup besar lebih awal saat startup.
  • Hasil: Perubahan ini secara signifikan menurunkan frekuensi terjadinya SIGABRT. Namun, ini bukan solusi yang sempurna, dan masih ada risiko crash jika library eksternal memanggil setenv.

  • Rencana ke depan: glibc sedang meneliti cara menyelesaikan masalah ini dengan tetap mempertahankan keamanan sinyal asinkron sambil menyinkronkan penggunaan envp. Pekerjaan ini kompleks, tetapi dalam jangka panjang mereka berencana mengusulkan solusi tanpa menyimpang dari spesifikasi POSIX.

1 komentar

 
GN⁺ 2024-11-12
Komentar Hacker News
  • Patch sedang ditinjau karena masalah stabilitas stack grafis Red Hat

    • Perbaikan thread safety untuk getenv kemungkinan besar akan masuk ke glibc 2.41
    • setenv sudah lebih mudah ditangani karena tidak membebaskan string lingkungan
    • unsetenv rumit karena masalah konkurensi
    • Alasan tidak ingin menambahkan penguncian ke getenv adalah untuk mempertahankan keamanan sinyal asinkron
    • Karena vfork+execve, sulit menghindari kebocoran memori sehingga perubahan pada penanganan environment menjadi kontroversial
  • Bersyukur Steam berjalan dengan baik di Linux

  • Praktik terbaik adalah membaca variabel lingkungan saat boot dan tidak menggunakan setenv

    • Saat membuat proses baru, sebaiknya duplikasi environment saat ini lalu perbarui nilai yang baru
    • Menggunakan getenv/setenv sebagai mekanisme pesan IPC bisa menimbulkan masalah
  • Ada pertanyaan apakah setenv merupakan API Linux

    • setenv didefinisikan dalam POSIX dan diimplementasikan di ruang pengguna, bukan di kernel Linux
  • Ada pertanyaan apakah ada kasus saat program memanggil setenv di satu thread dan menginginkan efeknya di thread lain

    • GLIBC mendokumentasikan fungsi-fungsi berbahaya dengan baik sehingga penguncian/penyalinan bisa ditambahkan
  • Ada masalah Steam mengeluh tidak ada koneksi

    • Menekan tombol 'coba lagi' beberapa kali membuatnya berfungsi, tetapi tetap merepotkan
  • Wawasan tentang klien Steam dan pemrograman Linux ini menarik

    • Bisa dipahami mengapa catatan rilis tidak detail, tetapi "perbaikan crash umum" terasa seperti ungkapan yang terlalu meremehkan
  • Untuk memperbaiki masalah di glibc, mungkin diperlukan kompromi fungsi

    • Dalam jangka panjang, hal itu bisa dikejar jika ada usulan yang masuk akal
  • Kinerja rendering klien Steam buruk saat mouse berada di dalam jendela

  • Ada bug lama yang terus bertahan di klien Steam Linux

    • Jika Steam dibiarkan berjalan lebih dari sehari, handle jendela habis sehingga aplikasi/jendela grafis baru tidak bisa dibuka
    • Jika menggunakan Steam Chat, masalah ini muncul lebih cepat
    • Masalah ini didokumentasikan di GitHub, tetapi ditutup tanpa alasan jelas
    • Secara pribadi, Steam di-restart setiap hari
    • Masalah ini juga diamati di KDE/Wayland dan X11