Escala acima de 65k arquivos abertos (conexões TCP)

3

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 user3188040 30.08.2015 / 20:35

3 respostas

2

Por Número máximo de soquetes no Linux , a variável sysctl vm.max_map_count pode ser útil aqui.

    
por 30.08.2015 / 20:47
3

Você pode estar colidindo com a limitação de portas de 16 bits (65536).

    
por 31.08.2015 / 03:19
0

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.

    
por 31.08.2015 / 03:32