2015-12-24 16 views
10

Non riesco a creare più di 32k di thread Java su macchine Linux con memoria 15G.Come aumentare il numero massimo di thread JVM (Linux 64 bit)

+1

è ragionevole? –

+0

@ guillaumegirod-vitouchkina È successo su una macchina generatrice di carichi per prove di carico. A causa della cattiva progettazione della libreria legacy di terze parti, erano necessari più thread per connessione di rete. Quindi il conteggio dei thread è stato aumentato rapidamente. La maggior parte dei thread si trova in uno stato inattivo. – maczniak

+0

OK. Capisco un simpatico. –

risposta

30

È possibile utilizzare uno sample program per individuare il limite di thread corrente.

Se si verifica Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread, controllare questi:

  1. Nelle macchine di memoria di piccole dimensioni

    filo Ogni Java consumare la propria memoria stack. La dimensione dello stack predefinito è 1024k (= 1M). È possibile ridurre le dimensioni dello stack come java -Xss512k .... JVM non può essere avviato se la dimensione dello stack è troppo bassa.

    E fare attenzione alle configurazioni della memoria heap: (iniziale) -Xms e (massimo) -Xmx. Più memoria viene allocata all'heap, meno memoria disponibile per lo stack.

  2. Limiti del sistema

    Alcuni valori in ulimit -a possono influenzare un limite della filettatura.

    • max memory size - illimitata sulla maggior parte delle macchine a 64 bit
    • max user processes - Linux tratta i fili come processi
    • virtual memory - illimitate sulla maggior parte delle macchine a 64 bit. utilizzo della memoria virtuale aumenta di configurazione di -Xss (default 1024k)

    È possibile modificare questi valori (temporali) in esecuzione ulimit comando o modifica (permanente) /etc/security/limits.conf.

  3. sys.kernel.threads-max

    Questo valore è il numero di sistema globale (inclusi i processi non JVM) massimo di thread. Controllare cat /proc/sys/kernel/threads-max e aumentare se necessario.

    echo 999999 > /proc/sys/kernel/threads-max
    o
    sys.kernel.threads-max = 999999 in /etc/sysctl.conf per cambiare in modo permanente.

  4. sys.kernel.pid_max

    Se cat /proc/sys/kernel/pid_max è simile al limite di corrente, aumentare questo. Linux tratta i thread come i processi.

    echo 999999 > /proc/sys/kernel/pid_max
    o
    sys.kernel.pid_max = 999999 in /etc/sysctl.conf per cambiare in modo permanente.

    E potrebbe essere necessario aumentare anche sys.vm.max_map_count.

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_count dovrebbe essere almeno (thread-count 2 x).

    Attempt to protect stack guard pages failed. e OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed. i messaggi di errore vengono emessi da JavaThread :: create_stack_guard_pages() e chiama os :: guard_memory(). In Linux, questa funzione è mprotect().

    echo 1999999 > /proc/sys/vm/max_map_count
    o
    sys.vm.max_map_count = 1999999 in /etc/sysctl.conf per cambiare in modo permanente.

+0

@scsere persone lo fanno molto http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-if-i-knew-the-answer-before-asking – Ramanlfc

+0

Ho passato alcune soluzioni solo questa offre la risposta che funziona! – javaPhobic

6

Ulteriori informazioni per sistemi Linux (systemd) moderni.

Ci sono molte risorse su questo di valori che potrebbero richiedere un tweaking (l'altra risposta è una buona fonte per la maggior parte di essi); tuttavia viene imposto un nuovo limite tramite il limite systemd "TasksMax" che imposta pids.max sul cgroup.

Per le sessioni di login il valore predefinito di UserTasksMax è il 33% del limite del kernel pids_max (in genere 12,288) e può essere sostituito in /etc/systemd/logind.conf.

Per i servizi il valore predefinito di DefaultTasksMax corrisponde al 15% del limite del kernel pids_max (in genere 4.915). È possibile sovrascriverlo per il servizio impostando TasksMax in "systemctl edit" o aggiornare DefaultTasksMax in /etc/systemd/system.conf

+0

Mi ci sono voluti anni per trovare questo. FINALMENTE! Molte grazie! – Ben

Problemi correlati