JMX,Jstatd做好JVM应用上线的最后一层保障
nanshan 2024-11-10 10:10 26 浏览 0 评论
一个成功的java项目标准并不仅仅是业务功能实现,但是纵观国内,很多项目组在前期项目开发设计中只考虑了业务功能,没有考虑项目后期维护的监控设计。没有完善的监控运维设计,项目存活的寿命应该也不长吧?好的项目能够吸引人留下来,并不断强化项目的功能优化每一处代码,坏的项目只会逼死人,不断地增加龌龊代码以至于根本无法维护。
当然从公司来说,业务的首要实现是公司能够赚钱的有效保障,公司赚不了钱了,写得再好的代码也只能静静地躺在硬盘中。我想一个负责的开发人员不仅要能重视业务功能的实现,还能保证在项目上线运维中针对突发情况做到监控。
我理解的监控
我理解的监控分两种,一种是运维的监控-监控整个集群的各项资源的使用情况以及各个服务的存活情况,另一种是开发的监控-监控代码问题导致的线程死锁,OOM等,以及业务消息的历史可回溯。
我是一名开发,这里主要讲讲我的心得,开发中的监控。如何减少开发人员不必要的加班。
代码异常监控
应用代码在面对线上各种请求时,经常会发生死锁,OOM等问题。这个时候我们应该如何去查看呢?如果我们不想连上远程服务器,可以通过本地的一些可视化工具连接远程程序,查看远程程序的线程,CPU,GC,堆内存等使用情况。
远程主机配置jmx
这里只是演示JMX的监控功能,JMX还有动态修改bean属性等功能不在这一篇文章讲解。
修改密码,找到配置文件$JAVA_HOME/jre/lib/management/jmxremote.password.template,复制一份并改名为jmxremote.password,然后修改只读权限并编辑jmxremote.passwrod,取消以下两行注释:
#monitorRole QED
#controlRole R&D
修改要启动的java程序启动参数(JVM_OPTS)。
打开tomcat的bin目录下的catalina.sh,加入以下内容**(非tomcat程序也类似)**
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.19.131 -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
参数authenticate表示是否需要密码认证,赋值为true就会使用jmxremote.password设置的密码。
修改文件权限
监控的程序是由哪个用户启动,则把jmxremote.password文件的权限改为这个用户的只读权限,
否则启动程序会报错:Error: Password file read access must be restricted。
这些在jmxremote.password里的注释都有说明。
比如,如果你是用intsmaze用户启动java程序
chown intsmaze jmxremote.passwordchmod 400 jmxremote.password
启动jvisualvm
先启动待监控的程序
sh startup.sh
左边栏,右键“远程”>>“添加远程主机”
左侧栏,右键刚才添加的远程主机>>“添加jmx链接”,使用配置的端口
如果我们不配置JVM_OPTS参数,那么我们在本地使用javaVisualVM是无法访问远程服务器上的tomcat服务的状况,要想知道远程服务器的状况就必须使用CRT等工具连上服务器使用linux命令去查看程序的运行情况。
监控服务器上的java程序
在java -cp 命令中加入如下参数即可
java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=22222
-cp jmx.jar cn.intsmaze.thread.TestDeadThread
TestDeadThread类如下
public class TestDeadThread implements Runnable {
int a, b;
public TestDeadThread(int a, int b) {
this.a = a;
this.b = b;
}
public void run() {
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(3000);
for (int i = 0; i < 100; i++) {
new Thread(new TestDeadThread(1, 2)).start();
new Thread(new TestDeadThread(2, 1)).start();
}
}
}
JvisiualVM通过JMX的方式连接到远程服务器上的JVM,
此时能获取到JVM的基本信息(启动参数、系统属性)、CPU使用情况、
堆内存整体情况以及线程的整体情况等。
但如果想通过Visual GC插件进一步了解堆内各区的情况的话,就会发现插件此时并不工作。
Visual GC插件不工作,是因为此插件使用的协议是RMI,因此需要使用下面的jstatd方式进行连接。
jstatd 连接到远程JVM
JVM jstat Daemon:守护进程,一个RMI服务器程序,用于监控本地所有JVM从创建开始直到销毁整个过程中的资源使用情况,同时提供接口给监控工具(如这里的VisualVM),让工具能连接到本机所有的JVM。
启动jstatd服务
${java_home}/bin目录下启动jstatd服务
[intsmaze@centos-Reall-131 bin]./jstatd
Could not create remote object
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:792)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
由于jstatd server没有提供任何对远程client端的认证,客户端程序获取到本地当前用户的所有JVM信息后可能存在安全隐患,所以jstatd要求启动之前必须指定本地安全策略,否则jstatd进程无法启动,抛出上面错误。
创建安全策略文件
在需要被监控的远程主机创建一个安全策略文件,比如保存为/home/intsmaze/jdk1.8.0_144/bin/jstatd-all.policy,内容如下:
grant codebase "file:/home/intsmaze/jdk1.8.0_144/lib/tools.jar" {
permission java.security.AllPermission;
};
启动jjstatd带参数
通过如下命令可以成功启动jstatd server
./jstatd -J-Djava.security.policy=/home/intsmaze/jdk1.8.0_144/bin/jstatd-all.policy
-J-Djava.rmi.server.logCalls=true./jstatd
-J-Djava.security.policy=/home/intsmaze/jdk1.8.0_144/bin/jstatd-all.policy &
向通过jstatd命令启动的JVM(Main class:sun.tools.jstatd.Jstatd)传递参数,比如-J-Xms48m指定了Jstatd这个JVM的初始堆内存为48MB
右键选择建立jstatd连接
对应的远程主机节点下会自动列出所有运行的JVM
JMX连接与JStatD连接的区别
JMX:使用JMX需要远程JVM在启动的时候开启远程访问支持,设定JMX端口等,每一个JMX连接一个远程JVM。
JStatD:使用jstatd连接方式时,需要在远程主机上创建安全策略文件然后启动jstatd进程,并且此进程需要一直保持运行状态,客户端可以看到远程主机上当前用户的所有JVM的信息,即只要创建一个jstatd连接。
linux命令监控jvm程序
如果我们不配置JMX和jstatd,那么我们无法使用jvisiualVM去监控远程JVM程序,要知道程序的运行状态我们必须连上服务器去查看。
top命令查看各进程CPU占用率
[intsmaze@centos-Reall-131 ~]$ top
top - 13:04:07 up 3 min, 2 users, load average: 0.00, 0.01, 0.00
Tasks: 104 total, 1 running, 103 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2086348k total, 224720k used, 1861628k free, 37484k buffers
Swap: 2064376k total, 0k used, 2064376k free, 91204k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
385 root 20 0 0 0 0 S 0.3 0.0 0:00.02 flush-8:0
2211 intsmaze 20 0 858m 25m 9448 S 0.3 1.2 0:00.87 java
- 第一行:load average: 0.41, 0.45, 0.43 系统负载,即任务队列的平均长度。1分钟前、5分钟前、15分钟前平均负载
- 第二行:Tasks: 141 total 进程总数,0 zombie 僵尸进程数
- 第三行为cpu信息
6.1% us 用户空间占用CPU百分比
1.5% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
92.2% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi 硬件中断
0.0% si 软件中断
0.0%st 实时 - 第四、五行为内存信息。
Mem: 191272k total 物理内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
123988k cached 缓冲的交换区总量
进程中每个线程占用cpu情况
[intsmaze@centos-Reall-131 ~]$ top -Hp 2461
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2462 intsmaze 20 0 870m 25m 9416 S 30.0 1.2 0:00.28 java
2463 intsmaze 20 0 870m 25m 9416 S 0.0 1.2 0:00.00 java
2464 intsmaze 20 0 870m 25m 9416 S 0.0 1.2 0:00.00 java
定位线程的运行情况
Jstack是JDK自带的命令行工具,主要用于线程Dump分析,能得到运行java程序的java stack和native stack的信息,可以轻松得知当前线程的运行情况。
jstack -l [pid]查看所有线程信息
jstack -l 2238 > intsmaze.log
[intsmaze@centos-Reall-131 ~]$ jstack -l 2461
"Thread-200":
at cn.intsmaze.thread.TestDeadThread.run(TestDeadThread.java:29)
- waiting to lock <0x9d62a3a0> (a java.lang.Integer)
at java.lang.Thread.run(Thread.java:748)
"Thread-10":
at cn.intsmaze.thread.TestDeadThread.run(TestDeadThread.java:30)
- waiting to lock <0x9d62a390> (a java.lang.Integer)
- locked <0x9d62a3a0> (a java.lang.Integer)
at java.lang.Thread.run(Thread.java:748)
jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?
jstack -l [pid] | grep 16进制
top -Hp [pid] 中获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可。
得到2462 的十六进制值
···
[intsmaze@centos-Reall-131 ~]$ printf "%x\n" 2462
99e
···
jstack -l 21711 | grep 99e
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x99e in Object.wait()
在nid=0x99e 的线程调用栈中,CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait(),然后去观察自己写的业务代码。
相关推荐
- 三种自建KMS激活系统自动激活windows方法
-
第一种:在windows服务器上搭建主要针对vol版本(win7、win10、win20xx、win2012等等)平台:我自己搭建的windows虚拟机,windows2016的操作系统软件:...
- 重装系统被收98元?避开Windows付费陷阱的实用指南
-
重装系统被收98元?避开Windows付费陷阱的实用指南有网友反映,在重装Windows系统后,屏幕突然弹出“激活系统需支付98元服务费”的提示,疑惑自己是不是遭遇了付费陷阱。事实上,微软官方的Wi...
- Windows Server2012远程桌面服务配置和授权激活
-
安装:注意:安装完毕之后需手动重启一下计算机配置终端服务管理工具---远程桌面服务---RD授权诊断程序,查看当前服务器有没有授权授权:运行—>gpedit.msc->计算机配置---管理...
- 新书速览|Windows Server 2022 系统与网站配置实战
-
讲述桌面体验、ServerCore/NanoServer,容器与云系统的配置1本书内容《WindowsServer2022系统与网站配置实战》秉持作者一贯理论兼具实践的写作风格,以新版的Wi...
- Windows激活全攻略:KMS神钥与专业工具的完美结合!
-
对于许多Windows用户来说,系统的激活是一个必经的过程。虽然Windows操作系统在未经激活的状态下也可以使用一段时间,但长期来看,未激活的系统会限制某些功能并频繁提示用户激活。以下是两种流行的激...
- 微软Win9全新激活技术曝光(微软系统激活有什么用)
-
2014-07-0905:46:00作者:徐日俄罗斯Wzor日前披露了更多关于Windows9的最新消息,据悉,Windows9将会在今年秋季亮相,其宣传口号是“想要开始按钮和开始菜单?如你所...
- 快速激活Windows 10/11:CMD命令详细教程
-
#记录我的2024#激活Windows操作系统是确保系统功能和安全更新正常运行的重要步骤。本文将为您分享如何使用命令提示符(CMD)在Windows10和Windows11上进行激活的详细步骤。...
- Wndows 2019 RDS应用发布部署(rds的安装和应用程序的发布)
-
安装前的准备1、需要提供服务器作为应用中心,应用中心的推荐配置如下表所示。规格建议1-10人11-20人21-50人51-100人100+人CPU4核8核16核内存8GB16GB32GB64GB系统盘...
- 解决 Windows 系统激活难题(如何解决windows激活问题)
-
今天,一位朋友给我说,他手头有三台电脑,均同时弹出系统未激活的提示。他对此毫无头绪,便急忙将电脑上出现的激活提示信息一股脑发给了我。我看到其中一台显示的是“Windows10企业版LTSC尚...
- 自建KMS激活服务器(自建kms激活服务器的风险)
-
自建KMS激活服务器Win10和office安装后,都需要激活才可以使用,一般可以输入购买的MAK激活码进行在线激活,也可以通过KMS激活,网上也有很多激活工具,但这些工具一般都含有病毒或木马程序,容...
- 30秒免费激活windows和office亲测有效!
-
“第三方工具有病毒?”“KMS服务器激活总失效?”今天给大家分享一个开源激活工具——MicrosoftActivationScripts(MAS),无需密钥、不装软件,30秒永久激活Window...
- 「操作系统」Windows 10 LTSC 2019 企业版C大集成更新版
-
Windows10LTSC企业版CHIANNET集成更新优化整合多镜像版,CHIANNET,是USBOS超级PE维护盘工具箱作者,长久以来一直默默的更新着,USBOSPE软件,电脑城装机及...
- 一文看懂Windows激活:自查方法+授权类型科普(Win7/Win10通用)
-
一、如何判断Windows是否永久激活?无论是Win7还是Win10,均可通过以下方法快速验证:命令提示符法(通用):按下Win+R,输入slmgr.vbs/xpr并按回车键运行即可查看是否...
- 部分Windows Server 2019/2022用户反馈无法运行微软Teams应用
-
IT之家7月2日消息,科技媒体borncity今天(7月2日)发布博文,报道称在多个WindowsServer版本上,MicrosoftTeams应用近期出现了运行故障。用...
- 这种Windows激活方式已有20年...(windows现在激活)
-
2006年微软正式发布WindowsVista,随之而来引入了一项新的激活机制「OEM激活」,这项机制在Vista和Win7上最为流行。其实WindowsServer自2008开始至2025版本一...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
手机如何设置与显示准确时间的详细指南
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
-
- 三种自建KMS激活系统自动激活windows方法
- 重装系统被收98元?避开Windows付费陷阱的实用指南
- Windows Server2012远程桌面服务配置和授权激活
- 新书速览|Windows Server 2022 系统与网站配置实战
- Windows激活全攻略:KMS神钥与专业工具的完美结合!
- 微软Win9全新激活技术曝光(微软系统激活有什么用)
- 快速激活Windows 10/11:CMD命令详细教程
- Wndows 2019 RDS应用发布部署(rds的安装和应用程序的发布)
- 解决 Windows 系统激活难题(如何解决windows激活问题)
- 自建KMS激活服务器(自建kms激活服务器的风险)
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)