日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Java應用CPU使用率高

Java應用程序運行中,會遇到Java應用(JVM)進程CPU使用率高的情況。在這種情況下,Java應用的性能通常會下降,我們可以借助一些工具或命令收集問題信息,進行分析診斷,找到并解決造成Java應用(JVM)進程CPU使用率高的原因。

重要 本文檔可能包含第三方產品信息,該信息僅供參考。阿里云對第三方產品的性能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。

使用edas-agent自帶的命令診斷

EDAS為導入ECS集群中的ECS提供了一個可以直接顯示出應用進程使用CPU的線程及其StackTrace,可以幫助您快速找到造成應用進程CPU使用率高的問題原因。

通過SSH登錄到CPU高的應用進程所在的ECS,執行su - admin命令切換到admin賬號后,然后執行以下命令,即可查看到應用進程中消耗CPU高的線程(默認前5個)。

edas busy-threads
說明 執行edas busy-threads -h命令可以查看該命令的具體使用幫助。

系統顯示類似如下。

09/28/19 22:57:07 [INFO] EXECUTING: busy-threads
[1] Busy(4.6%) thread(3222/0xc96) stack of java process(3221) under user(admin):
"main" #1 prio=5 os_prio=0 tid=0x00002ab68004e800 nid=0xc96 runnable [0x00002ab67c1df000]
 java.lang.Thread.State: RUNNABLE
  at java.net.PlainSocketImpl.socketAccept(Native Method)
  at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
  at java.net.ServerSocket.implAccept(ServerSocket.java:545)
  at java.net.ServerSocket.accept(ServerSocket.java:513)
  at org.apache.catalina.core.StandardServer.await(StandardServer.java:490)
  at org.apache.catalina.startup.Catalina.await(Catalina.java:819)
  at org.apache.catalina.startup.Catalina.start(Catalina.java:765)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:309)
  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:443)
[2] Busy(0.9%) thread(2725/0xaa5) stack of java process(2721) under user(admin):
"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x00002ba81004c000 nid=0xaa5 waiting on condition [0x0000000000000000]
 java.lang.Thread.State: RUNNABLE
[3] Busy(0.0%) thread(3221/0xc95) stack of java process(3221) under user(admin):
[4] Busy(0.0%) thread(2721/0xaa1) stack of java process(2721) under user(admin):

以下是常用的幾個參數及選項使用示例:

#每隔2秒執行一次執行結果,共執行5次(每次默認顯示應用進程中前5個使用CPU高的線程)。
edas busy-threads 2 5

#顯示指定Java進程的前5個使用CPU高的線程,[$JVM_PID]為Java進程的進程號,您可以使用ps -ef |grep java命令查看Java進程的進程號。
edas busy-threads -p [$JVM_PID]

#顯示Java進程中前10個使用CPU高的線程。
edas busy-threads -c 10

#顯示最近的2秒種內,CPU使用較高的線程。
edas busy-threads --current

使用開源工具診斷

show-busy-java-threads

在非ECS集群的環境中,可以使用show-busy-java-threads開源腳本來找到占用指定進程中排名前幾位CPU高的線程。執行以下命令,下載并使用show-busy-java-threads腳本。具體使用方法,請參見show-busy-java-threads。

wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
chmod +x show-busy-java-threads
./show-busy-java-threads

Arthas

除了該腳本外,還可以使用阿里巴巴的Java問題綜合診斷工具Arthas。該工具也可以用來顯示指定JVM進程中使用CPU的排名前幾位的線程。執行以下命令,顯示當前連接的JVM進程中CPU占用排名前3名的線程及StraceTrace信息。

說明 Arthas的下載方法請參見Arthas官網。
thread -n 3

系統顯示類似如下。

"as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE
  at sun.management.ThreadImpl.dumpThreads0(Native Method)
  at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)
  at com.taobao.arthas.core.command.monitor200.ThreadCommand$1.action(ThreadCommand.java:58)
  at com.taobao.arthas.core.command.handler.AbstractCommandHandler.execute(AbstractCommandHandler.java:238)
  at com.taobao.arthas.core.command.handler.DefaultCommandHandler.handleCommand(DefaultCommandHandler.java:67)
  at com.taobao.arthas.core.server.ArthasServer$4.run(ArthasServer.java:276)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:745)
  Number of locked synchronizers = 1
  - java.util.concurrent.ThreadPoolExecutor$Worker@6cd0b6f8
"as-session-expire-daemon" Id=25 cpuUsage=24% TIMED_WAITING
  at java.lang.Thread.sleep(Native Method)
  at com.taobao.arthas.core.server.DefaultSessionManager$2.run(DefaultSessionManager.java:85)
"Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@69ba0f27
  at java.lang.Object.wait(Native Method)
  - waiting on java.lang.ref.Reference$Lock@69ba0f27
  at java.lang.Object.wait(Object.java:503)
  at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) 

使用傳統方式診斷

在不能連接公網的情況下,您可以使用以下方法來獲取CPU占用較高的線程。執行以下命令,收集指定Java進程的信息。

top -Hbp [$JVM_PID] -d 1 -n 1 >> top.[$JVM_PID].txt && jstack [$JVM_PID] >> jstack.[$JVM_PID].txt
  1. 從收集到的top.XXX.txt中找到CPU占用率最高的線程ID(注意top.XXX.txtjstack.XXX.txt文件中的線程堆棧信息一一對應)。
  2. 執行以下命令,將找到的線程ID(十進制的數字)轉換成十六進制。
    printf %x [$Thread_ID]
    說明 [$Thread_ID]為第1步找到的線程ID。
  3. 用這些轉換后的十六進制的線程ID去jstack.XXX.txt文件中搜索,即可找到對應線程的信息。