Что означает «конечная точка Tomcat», ожидающая на мониторе объектов? - PullRequest
1 голос
/ 15 марта 2011

Просматривая трассировку стека неотвечающего веб-приложения, я понял, что некоторые данные не соответствуют принципу «как я думал».

Context

Приложение получает быстрый удар по медленной ссылке. Эти запросы, похоже, накапливаются, то есть образуют пробку на сервере приложений. Ведение журнала показывает, что число потоков / коннекторов http максимально (количество занятых потоков достигло значения maxThreads, равного 120).

  • Jboss 4.2.2
  • Использует вариант tomcat 6.0, называемый 'jboss-web'

Вопрос

Многие из потоков "делают что-то" - т.е. чтение из базы данных, запись в выходной поток и т. д. И все же более 50 потоков «ожидают на соединителе, чтобы предоставить новый сокет» (из комментариев)

Что именно это означает для программиста без сокетов?

Мои предыдущие предположения: неправильно

Я предполагал, что каждый http-поток «сделает свою работу» - получит запрос, выполнит некоторую работу и напишет ответ - и не нужно ждать чего-либо.

так ...

  • Что происходит? Может кто-нибудь уточнить, что такое сокет-сокет?
  • Какое значение имеет такое узкое место для настроек tomcat? (т.е. увеличить этот параметр, уменьшить его и т. д.)

** Stack Trace **

"http-0.0.0.0-80-90" daemon prio=6 tid=0x695e1400 nid=0x24c in Object.wait() [0x6e8cf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x09c34480> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at java.lang.Object.wait(Object.java:485)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
    - locked <0x09c34480> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
    at java.lang.Thread.run(Thread.java:619)
   Locked ownable synchronizers:
    - None

Фрагмент кода из org.apache.tomcat.util.net.JIOEndpoint Tomcat

     /**
     * Process an incoming TCP/IP connection on the specified socket.  Any
     * exception that occurs during processing must be logged and swallowed.
     * <b>NOTE</b>:  This method is called from our Connector's thread.  We
     * must assign it to our own thread so that multiple simultaneous
     * requests can be handled.
     *
     * @param socket TCP socket to process
     */
    synchronized void assign(Socket socket) {

        // Wait for the Processor to get the previous Socket
        while (available) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }

        // Store the newly available Socket and notify our thread
        this.socket = socket;
        available = true;
        notifyAll();

    }

спасибо

1 Ответ

4 голосов
/ 15 марта 2011

Параметр maxNumThreads не влияет на производительность контейнера сервлета, а не требует большей кучи и большего количества циклов процессора (если ваши потоки активируются).Однако каждый раз, когда вы изменяете этот параметр на значение больше 150, вы можете подумать о узком месте в вашем приложении.

Веб-сервер не предназначен для обработки более 100 одновременных запросов.Если вы оказались в такой ситуации, подумайте о кластеризации.Я вижу, что вы используете jbossweb, и здесь есть очень хорошая статья:

http://refcardz.dzone.com/refcardz/getting-started-jboss

Однако, поскольку я не думаю, что у вас более 100 одновременных запросов, я думаю, что этоузкое место в ваших приложениях.Необходимо проверить ваш драйвер jdbc, версию jdk, которую вы используете, версию tomcat (в вашем случае 6.0).Запросы к вашему приложению должны завершаться менее чем за 1 секунду - задержка в сети (и даже это слишком большая задержка), и если вы обнаружите, что они занимают больше времени, это, вероятно, где-то в вашем коде.Вы вручную закрываете / открываете соединения с базой данных, используете ли вы эффективную многопоточность в фоновом режиме, используете ли вы JMS.Это вещи, на которые обычно нужно смотреть.Другой может быть ошибка в вашей конкретной версии контейнера сервлета.

PS Если вы решите использовать большее количество максимальных потоков, возможно, имеет смысл уменьшить / увеличить размер стека потоков и посмотреть, как это повлияетспектакль.Если у вас есть долгоживущие потоки (которых не должно быть), вы можете увеличить размер стека.Если у вас есть недолговечные потоки, попробуйте уменьшить размер стека, чтобы сохранить немного памяти.-Xss - это флаг.

Кроме того, я только что увидел версию jboss AS, которую вы используете.Проверьте это также.Теперь, когда я смотрю на ваши симптомы, я считаю, что ваша проблема находится где-то в файлах конфигурации.

...