java.lang.OutOfMemoryError: não é possível criar um novo thread nativo: após a atualização do Ubuntu 14.04 para o Ubuntu 16.04

0

Temos um mecanismo de pesquisa Java distribuído baseado no Lucene que normalmente executa tantos processos que cada um pode ter seus próprios conjuntos de encadeamentos em ~ 100 hosts, mas temos uma implementação de desenvolvimento que pode ser executada em uma única estação de trabalho hex-core de 64GB que usamos para o desenvolvimento.

Nós tínhamos estado executando com sucesso o Ubuntu 14.04 nessas estações de trabalho com configurações de ulimit:

gada@C010390:~$ 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) 256189
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 51200
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) 256189
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Todos os processos do mecanismo de pesquisa são iniciados por um script de um único processo.

Recentemente, atualizamos para o Ubuntu 16.04 e agora estamos executando: java.lang.OutOfMemoryError: unable to create new native thread erros ao tentar iniciar todos os processos necessários. Pesquisei no Google e vi postagens sobre novos limites de recursos sendo definidos pelo systemd, por exemplo:

link

Eu tentei seguir este post e definir

DefaultTasksMax=infinity
TasksMax=infinity
UserTasksMax=infinity

no seguinte:

/etc/systemd/system.conf
/etc/systemd/user.conf
/etc/systemd/logind.conf

e reinicializando, mas isso não parece ter efeito algum.

Eu verifiquei o dpkg e pareço estar executando systemd 229-4ubuntu7 .

gada@C010390:~$ dpkg -l systemd
...
ii  systemd                                  229-4ubuntu7              amd64                     system and service manager

De acordo com este post:

link

os novos limites do processo systemd foram revertidos em 229-4ubuntu6 , mas ainda estou com problemas.

Alguém por favor pode me ajudar a diagnosticar qual limite de recursos do sistema está me impedindo de criar novos encadeamentos Java no Ubuntu 16.04 e como remover esse limite? Eu suponho que é devido a algum limite de systemd desde que é a grande diferença entre o Ubuntu 14.04 e 16.04, mas eu não sei com certeza e não sei o que mais em 16.04 poderia estar limitando a criação de threads. Agradecemos antecipadamente por qualquer ajuda.

    
por Jim 20.09.2016 / 17:21

2 respostas

1

Nós tivemos um problema idêntico e a causa raiz parecia ser que logind.conf não suporta "infinito". Em vez disso, você deve usar o limite exato (como UserTasksMax=32000 ).

Parece ser corrigido na última versão ( link ), mas pelo menos o nosso Ubuntu 16.04 teve o versão que não suportava infinity .

    
por Matti K 26.09.2016 / 12:00
0

O problema era de fato que havia um novo limite de tarefa logd systemd no Ubuntu 16.04 e que

UserTasksMax=infinity

não estava sendo aceito em /etc/systemd/logind.conf como o usuário Matti K sugeriu. Eu mudei isso para

UserTasksMax=51200

para coincidir com o número ulimit de arquivos abertos (o limite que alteramos no Ubuntu 14.04 para permitir que esta configuração funcione) e tudo funciona bem agora.

    
por Jim 26.09.2016 / 21:17