日常性能排查
线程排查
1.top 确定确定CPU高的进程pid
2.top -Hp pid 确定进程中的线程资源消耗情况
3.jstack pid > jstack.log 导出文本,查看当前java进程的堆栈状态(也可不导出 ssh界面上看)
4.linux下执行 printf "%x\n" 线程id, 将top -Hp CPU消耗高的线程id(十进制数) 转换为16进制, 在 jstack日志中搜索该线程 (nid=0X 16进制)
内存Dump
jmap
jmap -dump:format=b,file=$PATH/$FILE $PID
jmap -dump:live,file=jmap.hprof $PID
jstack
jstack $PID > $PATH/$FILE
JVM内存追踪
Java8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM的内部内存使用,一般在压测调参的时候使用,生产环境不要引入
#打开NMT会带来5%-10%的性能损耗
# off: 默认关闭 # summary: 只统计各个分类的内存使用情况. # detail: Collect memory usage by individual call sites.
# 在JVM 变量中启用
-XX:NativeMemoryTracking=[off | summary | detail]
查看
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
# summary: 分类内存使用情况.
# detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况。
# baseline: 创建内存使用快照,方便和后面做对比
# summary.diff: 和上一次baseline的summary对比
# detail.diff: 和上一次baseline的detail对比
# shutdown: 关闭NMT
创建baseline
#NMT允许我们跟踪内存分配如何随时间变化。首先,我们应该将应用程序的当前状态标记为基线:
jcmd <pid> VM.native_memory baseline
成功:Baseline succeeded
#NMT使用+和 - 符号将告诉我们在此期间内存使用情况如何变化:
#查看diff:然后,过了一会儿,我们可以将当前的内存使用情况与该基线(baseline)进行比较:
jcmd <pid> VM.native_memory summary.diff
开启自动OOM Dump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${CATALINA_BASE}
查看JVM使用情况
jmap -heap PID
IO排查
IO性能问题首先可以通过top 查看机器的整体负载情况,一般会出现CPU 的iowait 较高的现象
然后使用 pidstat -d 1 找到读写磁盘较高的进程
然后通过 strace -f -TT 进行跟踪,查看系统读写调用的频率和时间
通过lsof 找到 strace 中的文件描述符对应的文件 opensnoop可以找到对应的问题位置
截取某段时间日志
sed -n '/2021-11-05 15:00/,/2021-11-05 15:49/p' nginx.log >test.log
本文来自博客园,作者:酒粒,转载请注明原文链接:https://www.cnblogs.com/charliewch/p/16297106.html