Мы запускаем веб-приложение с java7 и tomcat7. В нашем приложении производительность понесла совершенно неожиданно. Среднее время отклика удвоилось, и в пиковые времена проблема даже ухудшилась.java deadlock ухудшает производительность
Мы распечатали дамп потока и нашли нить, сидящую в ожидании навсегда состояния. Мы сделали несколько дампов потоков, и состояние этой нити не изменилось.
"logback-66215" daemon prio=10 tid=0x00007f86f4115800 nid=0x3758 waiting on condition [0x00007f868d817000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00007f8ddf241fa8> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:925)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Ссылки в этой теме 0x00007f868d817000 и 0x00007f868d817000 не были найдены на свалке нити.
После перезагрузки tomcat нить исчезла, и производительность была такой, какой она должна быть.
Мы запускаем его на сервере с 12 ядрами. Мы контролируем использование ЦП, но не видим всплесков. Когда в пиковой нагрузке из-за около 500 запросов/сек потребление ЦП увеличилось до 800%, но не увеличилось до 1200% (что является максимальным). Он просто прекратил увеличиваться, когда достиг 800%, а затем проблемы с производительностью были действительно плохими, конечно.
Я недостаточно разбираюсь в внутренности резьбы, CPU, прерываниях, чтобы полностью понять эту ситуацию. Я действительно хотел бы понять эту проблему на более глубоком уровне.
Теперь мой вопрос: может ли кто-нибудь объяснить мне, почему такой тупик вызывает столько проблем? Почему он не отображается в использовании ЦП, поэтому мы видим полностью загруженный CPU? Или это просто проблема переключения контекста?