Limite de descritores de arquivo File descriptor limit (ulimit)
ID da causa so-fd · Responsável principal Infraestrutura de servidores (Equipe de infraestrutura) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
Cada conexão precisa de um descritor de arquivo (fd, o número que o SO atribui a cada arquivo ou socket aberto), e o número de fds que um processo pode abrir é limitado.
Por quê O número de jogadores simultâneos chega ao limite de descritores de arquivo do processo → Efeito O servidor não aceita novas conexões (Too many open files). Abrir logs e conexões com o BD também falha → Na tela A partir de um número exato de jogadores ninguém mais entra: não conecta ou fica em loading infinito
Logo após login ou manutenção, Quando junta muita gente
Responsável
Responsável principal Infraestrutura de servidores (Equipe de infraestrutura) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Fechar o socket sem falta ao encerrar a conexão (para evitar vazamento de fd), quando o accept falhar com EMFILE (falta de fd) parar de aceitar conexões por um momento ou aceitar com um fd reserva guardado de antemão e fechar na hora (para não gastar CPU processando sem parar o mesmo aviso de conexão).
O que fazer (Equipe de infraestrutura)
Verificar o ulimit e a configuração do serviço (LimitNOFILE do systemd), alertar quando chegar perto do limite.
Números de referência
No Linux, ainda é comum o limite ficar em 1.024 quando o serviço não é configurado à parte. Servidores de jogo costumam subir esse limite para dezenas ou centenas de milhares. O Windows não tem um limite padrão tão baixo.
No gráfico
Achata ao bater no limite · Fds abertos pelo processo, conexões simultâneas
Onde olhar
Ver o fd-nr (número de descritores de arquivo abertos) do processo do servidor do jogo com pidstat -v e o limite de arquivos abertos em /proc/PID/limits, e procurar falhas do accept (EMFILE, Too many open files) no log do servidor
Confirma se
O número de fds achata no valor do limite, e a partir desse momento o accept falha com EMFILE
Descarta se
Número de fds bem abaixo do limite: não é esta causa. Pedidos de conexão descartados no kernel: “Estouro da fila de conexões (backlog)”. Problema no rastreamento de conexões: “Tabela do conntrack cheia no servidor”
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
As conexões não aceitas continuam na fila de conexões (backlog) do kernel. Dependendo do código, o servidor continua recebendo o aviso de “nova conexão” e desperdiça CPU.