Niski limit wątku pojedynczego procesu Java w systemie Red Hat Linux

Mam problem z maszyną testową z systemem Red Hat Linux (wersja jądra to 2.4.21-37.ELsmp) przy użyciu Java 1.6 (1.6.0_02 lub 1.6.0_04). Problem polega na tym, że po utworzeniu pewnej liczby wątków w jednej grupie wątków system operacyjny nie chce lub nie może już więcej tworzyć.

Wydaje się, że jest to specyficzne dla wątków tworzących Java, ponieważ program do tworzenia wątków C był w stanie utworzyć około 1,5 tys. Wątków. Co więcej, nie dzieje się tak w przypadku Java JVM 1.4 ... może tworzyć ponad 1,4 tys. Wątków, choć oczywiście są one traktowane inaczej w odniesieniu do systemu operacyjnego.

W tym przypadku liczba wątków, które są odcinane, wynosi zaledwie 29 wątków. Jest to testowalne za pomocą prostego programu Java, który tworzy wątki, dopóki nie uzyska błędu, a następnie wydrukuje liczbę utworzonych wątków. Błąd to

java.lang.OutOfMemoryError: unable to create new native thread

Wydaje się, że nie mają na to wpływu takie rzeczy, jak liczba wątków używanych przez inne procesy lub użytkowników lub całkowita ilość pamięci używanej przez system w tym czasie. Ustawienia JVM, takie jak Xms, Xmx i Xss, nie zmieniają niczego (co jest oczekiwane, biorąc pod uwagę, że wydaje się, że problem dotyczy rodzimego wątku systemu operacyjnego).

Dane wyjściowe „ulimit -a” są następujące:

core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) 4
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 10240
cpu time             (seconds, -t) unlimited
max user processes            (-u) 7168
virtual memory        (kbytes, -v) unlimited

Limit procesu użytkownika nie wydaje się być problemem. Wyszukiwanie informacji o tym, co mogło być nie tak, nie przyniosło wiele, aleten post wydaje się wskazywać, że przynajmniej niektóre jądra Red Hat ograniczają proces do 300 MB pamięci przydzielonej na stos, a przy 10 MB na wątek dla stosu, wydaje się, że problem może tam być (choć wydaje się to dziwne i mało prawdopodobne).

Próbowałem zmienić rozmiar stosu za pomocą „ulimit -s”, aby to przetestować, ale żadna wartość inna niż 10240 i maszyna JVM nie uruchamia się z błędem:

Error occurred during initialization of VM
Cannot create VM thread. Out of system resources.

Zwykle potrafię obejść Linuksa, ale naprawdę nie wiem zbyt wiele o konfiguracji systemu i nie byłem w stanie znaleźć niczego, co mogłoby dotyczyć tego rodzaju sytuacji. Wszelkie pomysły dotyczące tego, jakie ustawienia systemu lub maszyny JVM mogą powodować takie zmiany, zostaną docenione.

Edycje: Uruchomienie programu limitu wątków, o którym mowa wcokół, nie było awarii, dopóki nie próbował utworzyć 1529-go wątku.

Problem nie wystąpił również przy użyciu maszyny JVM 1.4 (występuje z maszynami JVM 1.6.0_02 i 1.6.0_04, obecnie nie można przetestować przy użyciu JVM 1,5).

Kod testu wątków, którego używam, jest następujący:

public class ThreadTest {

   public static void main(String[] pArgs) throws Exception {

      try {
         // keep spawning new threads forever
         while (true) {
            new TestThread().start();
         }
      }
      // when out of memory error is reached, print out the number of
      // successful threads spawned and exit
      catch ( OutOfMemoryError e ) {
         System.out.println(TestThread.CREATE_COUNT);
         System.exit(-1);
      }
   }

   static class TestThread extends Thread {
      private static int CREATE_COUNT = 0;
      public TestThread() {
         CREATE_COUNT++;
      }
      // make the thread wait for eternity after being spawned
      public void run() {
         try {
            sleep(Integer.MAX_VALUE);
         }
         // even if there is an interruption, dont do anything
         catch (InterruptedException e) {
         }
      }
   }
}

Jeśli uruchomisz to z 1.4 JVM, to zawiesi się, gdy nie będzie mógł utworzyć więcej wątków i będzie wymagał zabicia -9 (przynajmniej dla mnie).

Więcej Edytuj:

Okazuje się, że system, w którym występuje problem, używa modelu wątków LinuxThreads, podczas gdy inny system działa dobrze, używa modelu NPTL.

questionAnswers(5)

yourAnswerToTheQuestion