Melhorias na estabilidade do cliente Steam no Linux
(ttimo.typepad.com)Melhorias na estabilidade do cliente Steam
-
Contexto: na atualização do cliente Steam de 5 de novembro, foram corrigidos travamentos comuns no Linux. Entre eles, o de maior impacto foi a mudança na forma de uso das funções
setenvegetenv. -
Problema:
setenvé uma API insegura no Linux, e seu uso em ambientes multithread pode causar problemas. Após uma chamada degetenv, pode ocorrer um travamento como SIGABRT em outra thread. -
Solução:
- A maior parte das chamadas de
setenvfoi removida, e o código foi refatorado para passar o ambiente ao criar processos usandoexecvpe. - As chamadas foram colocadas em cache para reduzir a dependência de
getenv. - Para os casos restantes de uso de
setenv, foi introduzido um “gerenciador de ambiente” que pré-aloca na inicialização um buffer de valores suficientemente grande.
- A maior parte das chamadas de
-
Resultado: com essas mudanças, a frequência de ocorrência de SIGABRT caiu significativamente. No entanto, isso não é uma solução perfeita, e ainda há risco de travamentos caso bibliotecas externas chamem
setenv. -
Próximos planos: no
glibc, está sendo estudada uma forma de resolver esse problema sincronizando o uso deenvpsem perder a segurança assíncrona de sinais. Esse trabalho é complexo, mas a proposta é apresentar uma solução de longo prazo que não fuja da especificação POSIX.
1 comentários
Comentários no Hacker News
Um patch está sendo avaliado por causa de problemas de estabilidade na stack gráfica da Red Hat
getenventre no glibc 2.41setenvjá é mais fácil de lidar porque não libera as strings de ambienteunsetenvé complicado por causa de problemas de concorrênciagetenvé preservar a segurança para sinais assíncronosvfork+execve, é difícil evitar vazamentos de memória, então mudanças no tratamento do ambiente são controversasAgradecimento pelo Steam funcionar bem no Linux
O melhor é ler as variáveis de ambiente na inicialização e não usar
setenvgetenv/setenvcomo mecanismo de troca de mensagens IPC pode causar problemasHá dúvidas sobre
setenvser uma API do Linuxsetenvé definido pelo POSIX e implementado em espaço de usuário, não no kernel LinuxHá uma pergunta sobre se existe caso em que um programa chama
setenvem uma thread e espera o efeito em outra threadHá um problema em que o Steam reclama que não há conexão
Os insights sobre o cliente Steam e programação no Linux são interessantes
Para resolver o problema na glibc, talvez seja necessário aceitar alguns compromissos de funcionalidade
O desempenho de renderização do cliente Steam no Linux é ruim quando o mouse está dentro da janela
Existe um bug antigo e persistente no cliente Steam para Linux