Skip to main content

File Descriptors no Linux | Linux

  • File Descriptors (FD) | Linux

alt text

O que é um File Descriptor

Um file descriptor (FD) é basicamente um número inteiro que o sistema operacional usa para identificar recursos abertos por um processo.

Não é só arquivo. Qualquer coisa que possa ser lida/escrita vira um FD:

  • arquivos (.txt, .log)
  • sockets (rede)
  • pipes
  • dispositivos (/dev/null, /dev/random)

👉 Em termos simples:

FD = "handle" que o processo usa para acessar algo aberto


Como funciona na prática

Quando um processo abre algo, o kernel devolve um número:

int fd = open("arquivo.txt", O_RDONLY);

Exemplo de retorno:

fd = 3

Isso significa:

  • o processo agora usa o número 3 para acessar esse arquivo
  • todas as operações usam esse número:
read(3, buffer, 100);
write(3, buffer, 100);
close(3);

FDs padrão (sempre existem)

Todo processo inicia com 3 FDs padrão:

FDNomeDescrição
0stdinentrada padrão
1stdoutsaída padrão
2stderrerro padrão

Exemplo:

ls > out.txt

Aqui:

  • stdout (1) → redirecionado para arquivo
ls 2> erro.txt
  • stderr (2) → redirecionado

Representação mental (muito importante)

Pense assim:

Processo
├── FD 0 → teclado
├── FD 1 → terminal
├── FD 2 → terminal (erro)
├── FD 3 → arquivo.txt
├── FD 4 → conexão TCP

Cada FD aponta para um recurso aberto.


Onde ver os file descriptors

No Linux, tudo fica em:

/proc/<PID>/fd

Exemplo:

ls -l /proc/1234/fd

Saída típica:

0 -> /dev/pts/0
1 -> /dev/pts/0
2 -> /dev/pts/0
3 -> /var/log/app.log
4 -> socket:[12345]

Limite de File Descriptors

Cada processo tem um limite de FDs abertos.

Ver limite atual:

ulimit -n

Exemplo:

1024

👉 Problema comum: Se ultrapassar esse limite:

Too many open files

Alterando limite

Tem dois níveis:

Temporário (shell atual)

ulimit -n 65535

Permanente

Editar:

/etc/security/limits.conf

Exemplo:

usuario soft nofile 65535
usuario hard nofile 65535

E também garantir:

/etc/pam.d/common-session

Contém:

session required pam_limits.so

Por que isso é crítico

Aplicações modernas usam MUITOS FDs:

  • APIs (cada conexão HTTP = socket = FD)
  • RabbitMQ consumers
  • Redis connections
  • arquivos de log

Exemplo real:

  • 10k conexões simultâneas → 10k FDs

Se não ajustar:

  • queda de conexão
  • erro em produção
  • comportamento instável

Caso prático (seu cenário)

Com:

  • SignalR
  • RabbitMQ
  • múltiplos clientes

Você provavelmente terá:

  • 1 FD por conexão websocket
    • conexões internas (Redis, Rabbit, DB)

👉 Ou seja:

6000 clientes ≈ 6000+ FDs

Se o limite for 1024 → vai quebrar


Boas práticas

  • aumentar ulimit -n para pelo menos 65535
  • monitorar uso:
lsof -p <PID> | wc -l
  • fechar conexões corretamente (close)
  • usar pooling (DB, HTTP, etc.)

Comandos úteis

Ver todos FDs abertos no sistema

lsof

Ver FDs de um processo

lsof -p <PID>

Contar FDs de um processo

ls /proc/<PID>/fd | wc -l

Ver quem está consumindo mais

lsof | awk '{print $1}' | sort | uniq -c | sort -nr

Resumo direto

  • FD é um número que representa algo aberto
  • tudo no Linux vira FD
  • cada conexão = 1 FD
  • existe limite → pode derrubar sistema
  • sistemas de alta escala precisam ajustar isso obrigatoriamente