【问题标题】:Troubleshoot High CPU Usage on Windows Server解决 Windows Server 上的高 CPU 使用率问题
【发布时间】:2018-03-26 11:46:59
【问题描述】:

我们有基于 J2EE 的 Web 应用程序。在我们的生产环境中,我们间歇性地面临着高 CPU 使用率 (80-90%)。 我们无法在我们的 QA 环境中复制它。

生产环境:Windows 2012 Server(64位),JDK 1.8(64位)

为了解决问题,我们采用了线程转储。 它显示总共 215 个线程。

111 threads are in WAITING status
34 threads are in RUNNABLE status
67 threads are in TIMED_WAITING status
3 threads are in BLOCKED status

我们如何找到导致 CPU 使用率高的线程?

线程转储

2016-03-01 11:07:52 全线程转储 Java HotSpot(TM) 64 位服务器 VM (25.5-b02混合模式):

"Thread-739969" - 线程 t@807668 java.lang.Thread.State: WAITING 在 java.lang.Object.wait(本机方法) - 等待 (一个 org.apache.solr.util.ConcurrentLRUCache$CleanupThread) 在 java.lang.Object.wait(Object.java:502) 在 org.apache.solr.util.ConcurrentLRUCache$CleanupThread.run(ConcurrentLRUCache.java:604)

锁定的可拥有同步器: - 无

"Thread-739968" - 线程 t@807667 java.lang.Thread.State: WAITING 在 java.lang.Object.wait(本机方法) - 等待 (一个 org.apache.solr.util.ConcurrentLRUCache$CleanupThread) 在 java.lang.Object.wait(Object.java:502) 在 org.apache.solr.util.ConcurrentLRUCache$CleanupThread.run(ConcurrentLRUCache.java:604)

锁定的可拥有同步器: - 无

"Thread-739963" - 线程 t@807662 java.lang.Thread.State: WAITING 在 java.lang.Object.wait(本机方法) - 等待 (一个 org.apache.solr.util.ConcurrentLRUCache$CleanupThread) 在 java.lang.Object.wait(Object.java:502) 在 org.apache.solr.util.ConcurrentLRUCache$CleanupThread.run(ConcurrentLRUCache.java:604)

锁定的可拥有同步器: - 无

"Thread-739962" - 线程 t@807661 java.lang.Thread.State: WAITING 在 java.lang.Object.wait(本机方法) - 等待 (一个 org.apache.solr.util.ConcurrentLRUCache$CleanupThread) 在 java.lang.Object.wait(Object.java:502) 在 org.apache.solr.util.ConcurrentLRUCache$CleanupThread.run(ConcurrentLRUCache.java:604)

锁定的可拥有同步器: - 无

"Thread-739960" - 线程 t@807659 java.lang.Thread.State: WAITING 在 java.lang.Object.wait(本机方法) - 等待 (一个 org.apache.solr.util.ConcurrentLRUCache$CleanupThread) 在 java.lang.Object.wait(Object.java:502) 在 org.apache.solr.util.ConcurrentLRUCache$CleanupThread.run(ConcurrentLRUCache.java:604)

锁定的可拥有同步器: - 无

"Thread-739959" - 线程 t@807658 java.lang.Thread.State: WAITING 在 java.lang.Object.wait(本机方法) - 等待 (一个 org.apache.solr.util.ConcurrentLRUCache$CleanupThread) 在 java.lang.Object.wait(Object.java:502) 在 org.apache.solr.util.ConcurrentLRUCache$CleanupThread.run(ConcurrentLRUCache.java:604)

锁定的可拥有同步器: - 无

"httpShardExecutor-3-thread-57429-processing-{core=actionscmets, 副本=core_node1, ShardRequest.shards=s1.asite.com:8983//solr//actionscmets|s1r1.asite.com:8983//solr//actionscmets, node_name=10.120.112.31:8983_solr,shard=shard1, 集合=actionscmets, ShardRequest.urlList=[http:////s1r1.asite.com:8983//solr//actionscomments, http:////s1.asite.com:8983//solr//actionscomments]}" - 线程 t@807648 java.lang.Thread.State:可运行于 java.net.SocketInputStream.socketRead0(本机方法)在 java.net.SocketInputStream.read(SocketInputStream.java:150) 在 java.net.SocketInputStream.read(SocketInputStream.java:121) 在 org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160) 在 org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84) 在 org.apache.http.impl.io.SocketInputBuffer.isDataAvailable(SocketInputBuffer.java:95) 在 org.apache.http.impl.AbstractHttpClientConnection.isStale(AbstractHttpClientConnection.java:310) 在 org.apache.http.impl.conn.ManagedClientConnectionImpl.isStale(ManagedClientConnectionImpl.java:158) 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:433) 在 org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) 在 org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:466) 在 org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:235) 在 org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:227) 在 org.apache.solr.client.solrj.impl.LBHttpSolrClient.doRequest(LBHttpSolrClient.java:376) 在 org.apache.solr.client.solrj.impl.LBHttpSolrClient.request(LBHttpSolrClient.java:328) 在 org.apache.solr.handler.component.HttpShardHandlerFactory.makeLoadBalancedRequest(HttpShardHandlerFactory.java:246) 在 org.apache.solr.handler.component.HttpShardHandler$1.call(HttpShardHandler.java:221) 在 org.apache.solr.handler.component.HttpShardHandler$1.call(HttpShardHandler.java:183) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor$1.run(ExecutorUtil.java:148) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

锁定的可拥有同步器: - 锁定(一个 java.util.concurrent.ThreadPoolExecutor$Worker)

【问题讨论】:

    标签: java performance cpu


    【解决方案1】:

    使用visualvm 来识别消耗CPU 的线程。一篇关于解释线程转储的好文章可以在 DZone 上找到:how-analyze-java-thread-dumps

    这应该可以让您识别线程,也许您已经可以直接识别问题本身。

    【讨论】:

      【解决方案2】:

      试试Jconsole(TopThread 插件)或visulavm(HotThread Detector 插件),这些插件可以解释你在寻找什么。检查this问题。

      【讨论】:

        【解决方案3】:

        Process Explorer是调试windows性能问题的强大工具。它可以检查死锁线程或内存问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-04
          相关资源
          最近更新 更多