服务器开启JMX监控
如果想要对远程服务器的进程进行监控,需要在服务器进行相关设置,启动守护进程。如果想进一步定制自己的MXBean,可以考虑在应用程序中registerMXBean,当然在web应用中也可以借助Spring MBean相关类库进行该操作。
开启JStatd守护进程
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
nohup jstatd -J-Djava.security.policy=/home/java/jstatd.all.policy -J-Djava.rmi.server.logCalls=true &
jstatd -J-Djava.security.policy=jstatd.all.policy
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:457)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:789)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
-Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.165
- -Dcom.sun.management.jmxremote.port:这个是配置远程connection的端口号的,要确定这个端口没有被占用;
- -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl;
- -Dcom.sun.management.jmxremote.authenticate=false指定了JMX 是否启用鉴权(需要用户名,密码鉴权),
- 2,3两个是固定配置,是 JMX的远程服务权限的;
- -Djava.rmi.server.hostname:这个是配置server的IP的;
Could not bind /JStatRemoteHost to RMI Registry
java.rmi.ConnectIOException: Exception creating connection to: 0.0.0.2; nested exception is:
java.net.SocketException: Invalid argument or cannot assign requested address
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:177)
at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)
Caused by: java.net.SocketException: Invalid argument or cannot assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 7 more
通过阅读下面的文档 http://my.oschina.net/xiaotian120/blog/207015,经过服务器上的一番调研,发现问题出现在hostname上,服务端调用 hostname -i 命令,显示出来的服务器主机名为0.0.0.2(这一点日志中有体现)。
JMX监控认证
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.access.file=/usr/java/jdk1.6.0_32/jre/lib/management/jmxremote.access -Dcom.sun.management.jmxremote.password.file=/usr/java/jdk1.6.0_32/jre/lib/management/jmxremote.password"
错误: 必须限制口令文件读取访问权限: /home/java/jmxremote.password
chmod 400 jmxremote.access 要求该文件是任何用户均不可写的
chmod 700 jmxremote.password 一定注意这个文件默认是不可写的

新建第一个MXBean
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ControllerMBean controllerMBean = new ControllerBean();
mbs.registerMBean(controllerMBean, new ObjectName("MyAppmbean:name=controller"));
javax.management.NotCompliantMBeanException: jmx.ControllerBean: Class jmx.ControllerBean is not a JMX compliant MXBean
at com.sun.jmx.mbeanserver.Introspector.throwException(Introspector.java:466)
at com.sun.jmx.mbeanserver.Introspector.getMXBeanInterface(Introspector.java:357)
at com.sun.jmx.mbeanserver.Introspector.checkCompliance(Introspector.java:166)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:317)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at jmx.Main.main(Main.java:16)
public static boolean isMXBeanInterface(Class<?> interfaceClass) {
if (!interfaceClass.isInterface())
return false;
if (!Modifier.isPublic(interfaceClass.getModifiers()) &&
!Introspector.ALLOW_NONPUBLIC_MBEAN) {
return false;
}
MXBean a = interfaceClass.getAnnotation(MXBean.class);
if (a != null)
return a.value();
return interfaceClass.getName().endsWith("MXBean");
// We don't bother excluding the case where the name is
// exactly the string "MXBean" since that would mean there
// was no package name, which is pretty unlikely in practice.
}
<bean id="mbServer" class="org.springframework.jmx.export.MBeanExporter">
<property name="autodetectModeName" value="AUTODETECT_ALL"/>
</bean> <bean name="mydomain:myobj=MyObjectMBean" class="com.api.example.jmx.ControllerBean"/>
基于注解的MBean管理
@Component
@ManagedResource(objectName = "org.springexample.jmx:name=ServerManager", description = "Server Manager")
public class ServerManagerImpl { private String serverName = "springServer";
private boolean serverRunning = true;
private int minPoolSize = 5;
private int maxPoolSize = 10; @ManagedAttribute(description = "The server name.")
public String getServerName() {
return serverName;
} @ManagedAttribute(description = "Server's running status.")
public boolean isServerRunning() {
return serverRunning;
} @ManagedAttribute(description = "Whether or not the server is running.", currencyTimeLimit = 20, persistPolicy = "OnUpdate")
public void setServerRunning(boolean serverRunning) {
this.serverRunning = serverRunning;
} @ManagedOperation(description = "Change db connection pool size.")
@ManagedOperationParameters({
@ManagedOperationParameter(name = "min", description = "Minimum pool size."),
@ManagedOperationParameter(name = "max", description = "Maximum pool size.")
})
public int changeConnectionPoolSize(int minPoolSize, int maxPoolSize) {
Assert.isTrue(minPoolSize > 0, "Minimum connection pool size must be larger than 0, min=" + minPoolSize);
Assert.isTrue(maxPoolSize > minPoolSize, String.format("Minimum connection pool size must be smaller than maximum, min=%s, max=%s", minPoolSize, maxPoolSize)); this.minPoolSize = minPoolSize;
this.maxPoolSize = maxPoolSize; int diff = maxPoolSize - minPoolSize; Random random = new Random();
int currentSize = (minPoolSize + random.nextInt(diff)); return currentSize;
} }
<context:component-scan base-package="com.api.example"/>
<context:mbean-export/>
服务器开启JMX监控的更多相关文章
- Tomcat开启JMX监控 visualvm
Tomcat开启JMX监控 https://blog.csdn.net/dongdong2980/article/details/78476393
- Tomcat开启JMX监控
搭建模拟环境: 操作系统:centos7内存:1Gjdk:1.8.0_131tomcat:8.0.48 环境准备我们这里就不直接演示了,直接配置tomcat的jmx 1.进入到tomcat的bin目录 ...
- Jetty服务器jmx监控
Jetty服务器jmx监控 Jetty 服务器增加jmx,jmx-remote模块 1.修改对应jetty服务器的配置文件start.ini追加如下两行–module=jmx–module=jmx-r ...
- Tomcat调优及JMX监控
Tomcat调优及JMX监控 实验背景 ====================================================== 系统版本:CentOS release 6.5 ( ...
- zabbix通过jmx监控tomcat
Zabbix版本: Zabbix 3.0.2 一.服务端配置 1.安装jdk(版本1.7.0_79) 安装与配置比较简单,过程省略.执行java -version命令,出现类似界面表示成功. 2. ...
- zabbix监控tomcat(使用jmx监控,但不使用系统自带模版)
一,zabbx使用jmx监控tomcat的原理分析 1.Zabbix-Server找Zabbix-Java-Gateway获取Java数据 2.Zabbix-Java-Gateway找Java程序(j ...
- Linux记录-JMX监控JAVA进程
3.修改xxx.sh 加入export JAVA_OPTS="-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.mana ...
- Linux记录-JMX监控Tomcat上传到falcon
1.登录测试服务器xxxxxx xxxxxx su root输入xxxx 2.先修改Tomcat的启动脚本,(linux下为catalina.sh),添加以下内容: CATALINA_OPTS=&qu ...
- 如何使用JMX监控Kafka
使用kafka做消息队列中间件时,为了实时监控其性能时,免不了要使用jmx调取kafka broker的内部数据,不管是自己重新做一个kafka集群的监控系统,还是使用一些开源的产品,比如yahoo的 ...
随机推荐
- Python mode_a
f = open("葫芦小金刚", mode="a", encoding="utf-8") # a, append 追加, 在文件的末尾写入 ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- 京东Java面试题(二)
1.set集合从原理上如何保证不重复 1)在往set中添加元素时,如果指定元素不存在,则添加成功.也就是说,如果set中不存在(e==null ? e1==null : e.queals(e1))的元 ...
- Thumbnailator java图片压缩,加水印,批量生成缩略图
地址:http://code.google.com/p/thumbnailator/ 1.指定大小进行缩放 //size(宽度, 高度) /* * 若图片横比200小,高比300小,不变 * 若图片横 ...
- matplotlib 操作子图(subplot,axes)
Matplotlib 中文用户指南 3.3 使用 GridSpec 自定义子图位置 ax:matplotlib.axes._subplots.AxesSubplot,的基本操作 ax.set_xtic ...
- OK335xS-Android pack-ubi-256M.sh hacking
#/******************************************************************************* # * OK335xS-Androi ...
- hive中实现类似MySQL中的group_concat功能
hive> desc t; OK id string str string Time taken: 0.249 seconds hive> select * from t ...
- Uboot启动命令使用
1.查看根文件系统中的内容 打断Uboot的启动,默认从SD卡启动,查看根文件系统中/boot下的内容(根文件系统在mmcblk0p1上):=> mmc rescan=> ext4ls m ...
- Windows环境下用jwplayer+Nginx搭建视频点播服务器
flv视频可以采用两种方式发布: 一.普通的HTTP下载方式 二.基于Flash Media Server或Red5服务器的rtmp/rtmpt流媒体方式. 多数知名视频网站都采用的是前一种方式. 两 ...
- Unity3D 4.x怎样实现动画的Ping Pong效果
近期在看Unity官方的Stealth项目教学视频,视频使用的是Unity旧的版本号,而我如今正在使用的是Unity 4.5,动画系统的操作全然不同了. 依照视频的方式根本无法设置动画的Ping Pi ...