周梦康 发表于 2021-02-25 107 次浏览 标签 : arthas

最近负责的一个项目流量比较高的情况,晚上总是报警,我对整个项目代码也不是很清楚,只能发现流量高的情况,cpu 打满 young gc 比较频繁且非常耗时。dump 了 heap 用工具没看出泄露

找了一台机器慢慢上调了相关jvm参数(不一定科学,不一定适合你的应用),调大了整个堆内存,和新生代内存上限。

机器 4核8G

-Xms5214m -Xmx5214m -Xmn1955m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m

改为了

-Xms5866m -Xmx5866m -Xmn4693m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m

这样堆内存的利用率从原来的30%~40%到现在的50%~75%,young gc 峰值从 35 减少到了 13,为了弄情况到底什么线程占用了 cpu 得抓现行

也可以用 jstack,大家可以参考 https://blog.csdn.net/guixunlong/article/details/8450897

我这里直接用arthas,写个脚本每分钟执行一次,因为 arthas 是交互式的,这里得补充点管道的知识,也就是下面的mknod arthas_input p

#!/bin/bash

ctime=$(date "+%H-%M-%S")
cpu_percent=`top -n 1 | grep Cpu| awk -F " " '{print int($2)}'`

if [ ${cpu_percent} > 80 ] ; then
  echo "${ctime}开始采集最占 cpu 的线程"
  mknod arthas_input p
  exec 8<> arthas_input
  ./as.sh <&8 &
  echo -e "1\n" >> arthas_input

  echo "thread -n 10 > $(pwd)/arthas.${cpu_percent}.${ctime}.result" >> arthas_input
  echo "quit" >> arthas_input
  rm -f arthas_input
  sleep 2s
fi

评论列表