У одного из наших клиентов появилась новая проблема: приложение останавливается. Дамп потока показывает, что все потоки зависают на сетевом вводе-выводе в вызовах JDBC.
Мы / я никогда не видели этих «сетевых IO» зависаний. Обычно проблемы с медленной машиной и БД имеют либо: а) один или два длительных запроса, либо б) блокировку / взаимоблокировку определенного типа. В любом из этих случаев потоки «зависают» на разных методах. Я никогда не видел, чтобы все 30+ потоков висели в сети IO.
Ниже я включил выдержку из дампа потока. Все HTTP-потоки зависают при одном и том же вызове java.net.SocketInputStream.read
.
Я говорил с их дба и сисадмином. По их словам, в последнее время в окружающей среде «ничего не изменилось», что могло бы вызвать эту проблему.
дБ среды
MSSQL 2005, 64-битный пакет обновления 2
Драйвер: sqljdbc.jar: 1.0 809 102
Примечание: они работают с более старым драйвером jdbc. AFAIK они пытались обновить драйвер с версии 1.0 до версии 1.2, но у них была другая проблема.
другие проблемы окружающей среды
Они работают как на сервере приложений, так и на сервере базы данных в виртуальных машинах VMWare. Я не знаю, как эта настройка влияет на производительность сети.
Видимо, это единственное приложение с этой проблемой. Я больше ничего не знаю об их сетевой архитектуре.
Вопросы
* какие-либо идеи по этой проблеме?
* если это сеть, какие дальнейшие шаги для анализа?
Приложение A: Выдержка из дампа темы
Все HTTP-соединения зависают одним и тем же способом:
"TP-Processor31" daemon prio=5 tid=0x04085b78 nid=0x970 runnable [0x0764d000..0x0764fd6c]
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.microsoft.sqlserver.jdbc.DBComms.receive(Unknown Source)
at com.microsoft.sqlserver.jdbc.IOBuffer.sendCommand(Unknown Source)
- locked (a com.microsoft.sqlserver.jdbc.DBComms)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.sendExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteQuery(Unknown Source)