Назад | Перейти на главную страницу

Поток Tomcat потребляет максимум ЦП

У нас есть сервер Tomcat 7.0.21, работающий на виртуальной машине OpenJDK Server (смешанный режим 20.0-b11). Веб-приложение работает нормально в течение нескольких часов или дней после запуска - типичная загрузка процессора составляет 1-2%.

В какой-то момент процесс tomcat начинает использовать 100% ЦП. Через какое-то время он будет израсходовать 200%, потом 300% и т. Д. (Есть 4 процессора).

Я выполнил эту команду, чтобы определить, какие потоки вызывают проблему:

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

... а затем получил дамп потока от JVM

kill -QUIT <processId>

Как и следовало ожидать, с ЦП на 200% возникает 2 проблемных потока. Их трассировки стека одинаковы:

"http-bio-80-exec-19" daemon prio=10 tid=0x08dcfc00 nid=0x192e runnable [0x442fe000]
   java.lang.Thread.State: RUNNABLE
    at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:339)
    at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:353)
    at org.apache.jsp.returnBubble_jsp._jspService(returnBubble_jsp.java:343)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    - locked <0x6f39c2b0> (a org.apache.tomcat.util.net.SocketWrapper)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:679)

Файл jsp, на который он ссылается (returnBubble_jsp.java:343) на самом деле не делает ничего особенного - он часто вызывается каждым пользователем. Если мы посмотрим на строку 343 сгенерированной java:

out.write("</td></tr>\n");

Так что я совершенно уверен, что причиной этого является не мой JSP! Обратите внимание, что номер строки действительно меняется в других проблемных потоках, но всегда похожий out.write метод.

Что делает эта ветка? И как мне этого не допустить?

Большое спасибо @Christopher Schultz - ваш комментарий заставил меня более внимательно изучить jsp, и вы были правы. Просто, когда вы это найдете. Для интереса у меня было вот такое:

for (int i=0; i<n; i++) { 
    ...
    myArray[i=3].method();
...
}

«Равные» должны были быть «минусом». Мог бы научить меня использовать в моей среде IDE шрифт большего размера!

попробуйте отключить задачу feedFetcher, так как это выглядит как другой поток, который может вызывать проблемы с динамической блокировкой;

"Timer-3" daemon prio=10 tid=0x46135400 nid=0x1901 runnable [0x45f69000]
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
    - locked <0x85153b58> (a java.net.SocksSocketImpl)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
    at java.net.Socket.connect(Socket.java:546)
    at java.net.Socket.connect(Socket.java:495)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:178)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:409)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
    - locked <0x851458d8> (a sun.net.www.http.HttpClient)
    at sun.net.www.http.HttpClient. (HttpClient.java:240)
    at sun.net.www.http.HttpClient.New(HttpClient.java:321)
    at sun.net.www.http.HttpClient.New(HttpClient.java:338)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:935)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:876)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:801)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139)
    - locked <0x851c9e58> (a sun.net.www.protocol.http.HttpURLConnection)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:654)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:783)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:518)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:905)
    at uk.rock7.tracker.FeedFetcher.run(FeedFetcher.java:73)
    at java.util.TimerThread.mainLoop(Timer.java:534)
    at java.util.TimerThread.run(Timer.java:484)