한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Guia do Lag em Jogos › L7 SO do servidor (kernel)

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)

Abrir o card interativo, com figuras e simulações →

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

Sintomas
Não conecta / loading infinito
Fatores
Perda de pacotes
Quem é afetado
Servidor inteiro
Quando
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.

Fontes

  1. systemd-system.conf(5) — Linux manual page systemd
    O padrão de DefaultLimitNOFILE para serviços é 1024:524288 (limite soft de 1.024)
  2. accept(2) — Linux manual page Linux man-pages
    Quando o processo chega ao limite de fds, o accept falha com EMFILE
  3. Maximum Number of Sockets Supported Microsoft
    O Winsock do Windows limita o número de sockets só pela memória disponível
  4. pidstat(1) — Linux manual page sysstat
    fd-nr do -v: número de descritores de arquivo abertos pelo processo
  5. proc_pid_limits(5) — Linux manual page Linux man-pages
    /proc/PID/limits mostra os valores soft e hard dos limites de recursos de cada processo

Veja também

Mesma camada: L7 SO do servidor (kernel)

Mesmo sintoma (Não conecta / loading infinito) em outras camadas

Ver o card interativo, com figuras e simulações