Tomcat6 в Linux использует 100% ЦП, когда ServerSocket находится в режиме ожидания - PullRequest
3 голосов
/ 28 февраля 2010

Привет

Я запускаю свое веб-приложение на Tomcat6 на Java6 на Ubuntu8.04. Основной сервлет этого приложения открывает ServerSocket со следующим простым кодом:

ServerSocket serverSocket = new ServerSocket(6767);

Socket xmlSocket = serverSocket.accept();        

Конечно, это выполняется в отдельном потоке и с необходимыми блоками try-catch.

Когда я запускаю Tomcat, он сразу переходит на 100% загрузку ЦП и остается там до тех пор, пока клиент не подключится к порту 6767. Пока клиент подключен, нагрузка снижается до 0%. Как только клиент отключается, нагрузка возвращается к 100%.

Кто-нибудь может сказать мне, о чем это?

Спасибо!

РЕШЕНИЕ:

Оба ответа ниже были очень полезными. Проблема на самом деле не связана с ServerSocket, но с бессонным циклом while в совершенно другом потоке приложения, но также зависит от того, подключен клиент или нет.

Мне удалось идентифицировать активные потоки с помощью команды JDK "jstack", а затем было легко найти тот, с циклом убегания.

Спасибо за помощь! :)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Возможно, самый простой способ выяснить, что происходит, - это дождаться, пока он заработает на 100%, и сгенерировать дамп потока с помощью Ctrl-Break (или использовать SendSignal или аналогичный). Вы получите набор потоков вместе с их состоянием, и должно быть очевидно, какой из них запущен и где он находится в коде.

1 голос
/ 28 февраля 2010

Как только клиент отключается, нагрузка возвращается к 100%.

Это обычно имеет место в "while loop" без сна ().
См. эту тему для иллюстрации.

Пример:

try
{
  while (m_flagRunUserThreadManager)
  {
    try
    {
      m_listenSocket.setSoTimeout(10000);
      Socket clientSocket = m_listenSocket.accept();
      //create a thread for client
      MyClientHandler clientHandler = new ClientHandler(clientSocket);
      clientHandler.setPriority(Thread.MIN_PRIORITY);
      clientHandler.start(); 

    }
    catch(SocketTimeoutException excp)
    {
      String strError = "No requests for 10 Sec.";
      //display this message    
    }
  }
}
catch(IOException excp)
{
    // display the exception
}

Это потому, что ваш while loop имеет путь через него без сна, особенно когда ваша попытка не удалась.
Вам нужно где-то поспать, чтобы другие потоки / процессы получили шанс. Либо так, либо не продолжайте примерять клиента, который уже потерпел неудачу.

...