Comment augmenter le nombre maximum de threads JVM (Linux 64bit)

Je ne peux pas créer plus de 32K threads Java dans une machine Linux avec une mémoire de 15G.

12
demandé sur maczniak 2015-12-24 14:45:06

2 réponses

vous pouvez utiliser un exemple de programme pour connaître la limite actuelle des threads.

si vous rencontrez Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread , cochez ces cases:

  1. dans les petites machines à mémoire

    chaque fil Java consomme sa propre mémoire de pile. La taille par défaut de la pile est de 1024k (=1M). Vous pouvez réduire la taille de la pile comme java -Xss512k ... . JVM ne peut pas être lancé si la taille de la pile est trop faible.

    et méfiez-vous des configurations mémoire tas: (initial) -Xms et (maximum) -Xmx . Plus de mémoire est attribuée à heap, moins de mémoire disponible pour stack.

  2. les limites du Système

    certaines valeurs de ulimit -a peuvent affecter une limite de thread.

    • max memory size - illimité sur la plupart des machines 64bit
    • max user processes - linux traite les threads comme les processus de
    • virtual memory - illimité sur la plupart des machines 64bit. utilisation de la mémoire virtuelle est augmenté par -Xss de configuration (par défaut 1024k)

    vous pouvez modifier ces valeurs en lançant la commande ulimit ou en éditant /etc/security/limits.conf .

  3. sys.kernel.threads-max

    cette valeur est le nombre maximum de threads. Cochez cat /proc/sys/kernel/threads-max et augmentez si nécessaire.

    echo 999999 > /proc/sys/kernel/threads-max

    ou

    sys.kernel.threads-max = 999999 dans /etc/sysctl.conf pour changer en permanence.

  4. sys.kernel.pid_max

    si cat /proc/sys/kernel/pid_max est semblable à la limite actuelle, augmenter cette limite. Linux traite les threads comme des processus.

    echo 999999 > /proc/sys/kernel/pid_max

    ou

    sys.kernel.pid_max = 999999 dans /etc/sysctl.conf pour modifier de façon permanente.

    et vous pourriez avoir besoin d'augmenter sys.vm.max_map_count , aussi.

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_count doit être au moins (2 x thread-count).

    Les messages D'erreur

    Attempt to protect stack guard pages failed. et OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed. sont émis par JavaThread::create_stack_guard_pages(), et il appelle os::guard_memory(). Sous Linux, cette la fonction est mprotect().

    echo 1999999 > /proc/sys/vm/max_map_count

    ou

    sys.vm.max_map_count = 1999999 dans /etc/sysctl.conf pour changer en permanence.

35
répondu maczniak 2017-05-23 12:02:59

informations Supplémentaires pour moderne (systemd) les systèmes linux.

il y a beaucoup de ressources à ce sujet de valeurs qui peuvent avoir besoin de retouches (l'autre réponse est une bonne source pour la plupart d'entre eux); cependant une nouvelle limite est imposée par le biais de la limite systemd "TasksMax" qui fixe les pid.max sur les cgroup.

pour les sessions de connexion le UserTasksMax par défaut est 33% de la limite du noyau pids_max (généralement 12,288) et peut être outrepassé dans /etc/systemd/logind.conf.

pour les services DefaultTasksMax par défaut est de 15% de la limite du noyau pids_max (habituellement 4,915). Vous pouvez l'Annuler pour le service en définissant TasksMax dans "systemctl edit" ou mettre à jour DefaultTasksMax dans /etc/systemd/system.conf

8
répondu Trent Lloyd 2017-04-01 13:29:18