在linux服务器上初步定位java接口耗时
# 查看linux服务器cpu使用最高的pid top -c # 查看指定进程pid中cpu使用最高的线程pid top -Hp 39348 -c # 转成16进制 printf "%x\n" 39361 # java查看指定进程pid中对应线程信息 jstack 39348 | grep 99c1 #Jstack的输出中,Java线程状态主要是以下几种: RUNNABLE 线程运行中或I/O等待 BLOCKED 线程在等待monitor锁(synchronized关键字) TIMED_WAITING 线程在等待唤醒,但设置了时限 WAITING 线程在无限等待唤醒
# 例如出现数据库查询sql卡死 # 就会有大量线程为处于TIMED_WAITING状态,并且堆栈信息显示数据库驱动的类名 # 查看sqlserver耗时sql SELECT TOP 20 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)], SUBSTRING(qt.text,qs.statement_start_offset/2+1, (CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1) AS [使用CPU的语法], qt.text [完整语法], dbname=db_name(qt.dbid), object_name(qt.objectid,qt.dbid) ObjectName FROM sys.dm_exec_query_stats qs WITH(nolock) CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE execution_count>1 ORDER BY total_worker_time DESC;