jboss7, java.lang.OutOfMemoryError: невозможно создать новый собственный поток - PullRequest
0 голосов
/ 20 февраля 2012

Я использую jsp-сервлет в своем приложении. и развернул войну на сервере jboss 7.0.2. у меня есть сервлет с кодом, связанным с базой данных, и он вызывается много раз в секунду (скажем, 500 раз). но он падает для такого количества потоков, jboss 7.0.2 не сможет обработать эти потоки.

Я использую 64-битную JVM.

Я уменьшил размер стека с помощью -Xss256k, у меня это не работает.

я сделал настройку в jboss.conf

wrapper.java.additional.10 = -XX: ThreadStackSize = 256k

Мне нужно обработать 2000 потоков на jboss7.

сервер (jboss7.0.2) выдает исключение.

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

 at java.lang.Thread.start0(Native Method)

 at java.lang.Thread.start(Unknown Source)

Вот мой сервлет java.lang.OutOfMemoryError: невозможно создать новый собственный поток

    public class Test extends HttpServlet {

private static final long serialVersionUID = 1L;



public Test() {

    super();

}



protected void doGet(HttpServletRequest request,

          HttpServletResponse response) throws ServletException, IOException   {

    processRequest(request, response);

}



protected void doPost(HttpServletRequest request,

        HttpServletResponse response) throws ServletException, IOException {

    processRequest(request, response);

}



public void processRequest(HttpServletRequest request,

        HttpServletResponse response) {

    Logger log=LoggerFactory.getLogger(feedback.class);



       /*   here is my code to insert the data in database. */



            TestClass testobj = new TestClass();       



            testobj.setparam("");





    smsmanager1.add(sms);



    smsmanager1 = null;

    sms = null;





}

  }

код для добавления метода

   public void add(T obj) {

         SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

         Session session=sessionFactory.openSession();

         Transaction transaction = null;

         try {

                 transaction = session.beginTransaction();

                 session.save(obj);

                 transaction.commit();

                 session.flush();



         } catch (HibernateException e) {

             if(transaction!=null){

                 transaction.rollback();}

                 e.printStackTrace();

         } finally {

             if(session!=null){

                 session.close();}

                 session = null;

                 transaction = null;

         }

Я проверил пустой сервлет с единственным оператором печати консоли. он работает нормально, но не работает для вышеуказанного сервлета.

Я на правильном пути?

как сервер будет обрабатывать такой сервлет для выше 500-800 потоков?

1 Ответ

1 голос
/ 20 февраля 2012

Varsha;

2000 потоков звучит как слишком много потоков. Вы не упомянули, сколько процессоров имеет ваша целевая машина, но я полагаю, что для Tomcat эмпирический максимум на процессор составляет около 200-250, поэтому, по консервативным причинам, вам потребуется 10 [зарезервированных (+)] процессоров для поддержки 2000 параллельных потоков.

(+) Я говорю зарезервировано, потому что, очевидно, вам понадобится процессорная емкость и для других вещей.

Что еще более важно, имейте в виду, что каждый поток должен получать, использовать и освобождать соединение с базой данных, поэтому маловероятно, что ваш сервер приложений или ваша база данных смогут достичь или поддерживать такую ​​пропускную способность. Если вы просто попытаетесь выделить эти ресурсы, вы завалите свою систему и начнете получать ошибки, подобные той, которую вы описали.

Я бы пересмотрел ваш подход с учетом следующих предпосылок:

  1. Ограничить количество потоков [Tomcat] до 100 X числа процессоров. Разрешить щедрое отставание запросов, если ваши клиенты могут терпеть ожидания вместо ошибок, если нет потоков, которые сразу же доступны для обработки запроса.
  2. Реализация пула соединений с базой данных, который ограничивает количество соединений максимальным числом одновременных потоков, начиная с # 1 и выше (плюс все, что вам нужно для других действий). Если база данных подвергается нагрузке при этой нагрузке, вам может потребоваться уменьшить размер пула соединений, и потоки запросов должны будут ждать соединения.
  3. Как только вы убедитесь, что у вас есть приемлемо настроенный экземпляр сервера приложений, вы можете увеличить масштабируемость, кластеризовав несколько узлов и внедрив балансировку нагрузки для запросов.

Приветствие.

PS. Это хорошая презентация о том, как рассчитать количество узлов, необходимых для удовлетворения определенного количества и содержания трафика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...