在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;

 

posted @ 2020-06-08 13:20  墨阳  阅读(723)  评论(0编辑  收藏  举报