Por Número máximo de soquetes no Linux , a variável sysctl vm.max_map_count
pode ser útil aqui.
Eu tenho um requisito para o meu servidor LTS Ubuntu 14.04.3 ter clientes > 65k conectados a ele via TCP. Embora eu tenha memória & cpu de sobra eu sou incapaz de obter mais de 65k clientes para se conectar. Eu suspeitava que fosse um problema de limite de arquivo aberto, no entanto, eu segui as muitas soluções existentes no stackoverflow para alterar o limite do número de arquivos abertos, mas ainda estou atingindo o limite. Eu fiz as seguintes alterações ...
/etc/security/limits.conf
* soft nofile 500000
* hard nofile 500000
root soft nofile 500000
root hard nofile 500000
/etc/pam.d/common-session
session required pam_limits.so
/etc/pam.d/common-session-noninteractive
session required pam_limits.so
/etc/sysctl.conf
fs.file-max = 500000
Quando verifico o ulimit, ele parece estar corretamente atualizado, como você pode ver abaixo ...
:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30038
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 500000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 30038
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
:~$ cat /proc/1739/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size unlimited unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 30038 30038 processes
Max open files 500000 500000 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 30038 30038 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
Infelizmente ainda parece haver algum limite em algum lugar impedindo que clientes adicionais sejam adicionados à medida que o servidor atinge 65.589 arquivos abertos e se recusa a abrir arquivos adicionais (conexões tcp).
:~$ sudo ls /proc/1739/fd | wc -l
65589
Existe alguma outra configuração no ubuntu / linux que precisa ser alterada?
Atualizar
vm.max_map_count
parece ter feito o truque definindo sudo sysctl vm.max_map_count=16777216
e adicionando a entrada vm.map_map_count a /etc/sysctl.conf
.
Como você pode ver ...
:~$ sudo ls /proc/2391/fd | wc -l
73609
:~$ netstat -an | grep ESTABLISHED | wc -l
73561
Terei que tomar cuidado, é claro, para definir o número de arquivos abertos para um limite que corresponda à quantidade desejada de utilização da memória. Fora do link @ sysadmin1138 desde que houvesse outra página recomendando um guia aproximado de 16K de memória por mapa (open tcp socket), que parece ser um bom lugar para começar. Embora eu esteja vendo um sintoma diferente agora, em que o número de arquivos / soquetes abertos flutua quando o servidor tenta publicar uma mensagem para os clientes conectados. Então, isso exigirá mais investigações.
Por Número máximo de soquetes no Linux , a variável sysctl vm.max_map_count
pode ser útil aqui.
Você pode estar colidindo com a limitação de portas de 16 bits (65536).
Como afirmam outros, provavelmente você está atingindo o número máximo de portas permitidas em uma única interface.
Provavelmente, você poderia adicionar uma interface aliada a seu aplicativo nesse IP e começar a atender solicitações do novo IP.
Tags linux filesystems ubuntu