日常性能排查

线程排查

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




posted @ 2022-05-22 10:17  酒粒  阅读(28)  评论(0编辑  收藏  举报