vlambda博客
学习文章列表

tomcat的安装和自动化thread线程快照

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!

某项目现场,经常出现CPU高的时候,这种情况发现了多次,通常是代码存在一些问题,导致CPU高,经常人工去恢复,有时又未做线程快照,无法定位到具体的问题。于是想写一个小脚本,自动去获取,下面是本次的一点尝试。



Tomcat的简介


Tomcat服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Xx通信企业使用较普遍的版本为Tomcat8的大版本。由于开源软件的漏洞比较多,建议厂商在安装Tomcat服务器时,建议安装所需大版本最新小版本。
各个版本的Tomcat在Linux,window操作系统的安装过程大致相似。
下面以在linux 的Tomcat8.5.72为例,详细描述Tomcat的安装过程。该安装文档适用于各个版本的Tomcat安装。



最小化安装要求


安装要求: 安装tomcat遵循最小化安装原则,安装最小化组件,开启最小化端口,关闭非必须服务。
  • Server(代表tomcat instance(实例),即表现出的一个jvm进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;)
  • Service(用于实现将一个或多个connector组件关联至一个engine组件;)
  • Connector(接入前端用户请求;)
  • Engine(Servlet实例,即servlet引擎,其内部可以有一个或多个host组件来定义站点;通常需要通过defaultHost来定义默认的虚拟主机;)
  • Host(位于engine内部用于接收请求并进行相应处理的主机或虚拟主机;)
  • Context(Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中一个Web应用程序;)
  • Value(Value组件类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器可以建多个Value,而且Value定义的次序也决定了他们生效的次序。)
  • Realm(一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许。)



JDK环境安装



  • Tar –zxvf jdk-8u281-linux-x64.tar.gz

  • java -version

  • export JAVA_HOME=/app/jdk1.8.0_281

  • export JRE_HOME=$JAVA_HOME/jre

  • export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

  • export PATH=$JAVA_HOME/bin:$PATH

tomcat的安装和自动化thread线程快照



TOMCAT环境安装


1. Tomcat安装及启动
Tar –xvf *tar.gz
sh /app/tomcat/apache-tomcat-8.5.72/bin/startup.sh
2. Tomcat访问
http://192.168.1.111:8080/
tomcat的安装和自动化thread线程快照



自动化线程快照


1. 实现逻辑

当主机CPU大于80%时,由于一个主机存大多个JAVA进程,按进程CPU大小,大于某个阈值时调用jstack程序生成快照,同时上传至FTP,使用MT工具分析DUMP

2. 实现脚本

#!/bin/bash
source /etc/profile
log_file="/tmp/dump.log"
script_name="thread_dump.sh"
datee=$(date +"%Y-%m-%d-%H:%M:%S")
#######DECALRE
pro_cpu_rate=10.0
ipaddr=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|grep "^1XXXX"|head -n 1)
###########################
ps axf -o "pid %cpu command"|grep java|grep -v grep > /tmp/thread_${ipaddr}_${datee}_ddl
#################################
which  jstack
if [ $? -eq 0 ] ;then

function pro_cpu
{
ps axf -o "pid %cpu command"|grep java|grep -v grep|awk '{if($2>=$pro_cpu_rate) print $1}' | while read procid
do
echo $procid
done
}

function log_echo
{
typeset log_message=$1
typeset log_date=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${log_date}] [${script_name}] ${log_message}" >> $log_file
}

log_echo "start jstack thread"


for i in `pro_cpu`
do
log_echo "process num $i start"
jstack $i > /tmp/thread_${ipaddr}_${datee}_$i
log_echo "process num $i end"
sleep 5
done

function file_upload
{
ftp -n <<EOF
open XXXX
user XXXX
binary
lcd /tmp
cd thread_snapshot
prompt
mput thread*
close
bye
EOF
}

function file_delete
{
cd /tmp && rm -rf thread*
}

file_upload
file_delete
cat $log_file

else
echo 0
exit;
fi



tomcat的安装和自动化thread线程快照



本文作者:唐田寿

本文来源:IT那活儿(上海新炬王翦团队)