使用JMX监控游戏服务器

标签: javajmx游戏监控
344人阅读 评论(0) 收藏 举报
分类:

游戏服务器运行过程中,我们希望能够对游戏里各种资源进行监控。比如,查看在线玩家总人数,查看内存使用情况,统计请求消息数量等等。这种问题归结起来就是,我们希望查看游戏进程的内存数据。

前边有一篇文章 (查看生产环境的内存数据),介绍如果通过加载类文件或使用javascript脚本查看内存数据。但这篇文章并没有介绍如何让游戏进程执行我们外部的代码,这属于跨进程通信的范畴,总体来说也是比较复杂的。

现在,我打算介绍另外一种黑科技,让监控游戏服务器更加方便快捷。

我们使用的工具叫做JMX(Java Management Extentesions),简单来说,就是对运行中的服务器进行各种资源监控的工具。

有了JMX,我们可以轻易查看游戏进程里的各种资源,甚至触发各种管理接口。

关于JMX的具体框架结构,我了解得也不深入,就不过多介绍了=。=

我们直奔主题,来点干货吧。

1.使用JMX工具,我们首先需要定义一个接口,该接口必须以MBean词尾

定义MBean接口(ControllerMBean.java)

package com.kingston.jmx;

public interface ControllerMBean {

	/**
	 * 统计在线玩家总数
	 * @return
	 */
	int getOnlinePlayerSum();
	
	/**
	 * 统计内存使用情况
	 * @return
	 */
	String getMemoryInfo();
	
	/**
	 * 执行指定脚本 
	 * @param scriptId
	 */
	void exceScript(int scriptId);
	
	/**
	 * 关服
	 */
	void closeServer();
	
}


2.MBean接口实现类(Controller.java),命名必须是对应接口的前缀(除去MBean的部分)。

类似javabean规范,mbean类也有自己的规范,例如以get开头的方法,会被转换为对应的属性。

package com.kingston.jmx;

import com.kingston.jmx.ControllerMBean;
import com.kingston.jmx.GameStarter;

public class Controller implements ControllerMBean{

	@Override
	public int getOnlinePlayerSum() {
		return 100;
	}


	@Override
	public String getMemoryInfo() {
		StringBuilder sb = new StringBuilder();
		sb.append("free:")
		  .append(Runtime.getRuntime().freeMemory())
		  .append(",\n")
		  .append("total:")
		  .append(Runtime.getRuntime().totalMemory());
		
		return sb.toString();
	}

	@Override
	public void exceScript(int scriptId) {
		System.err.println("成功执行脚步"+scriptId);
	}
	
	@Override
	public void closeServer() {
		GameStarter.run = false;
	}

}


3.MBean的宿主,也就是游戏进程(GameStarter.java)

package com.kingston.jmx;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class GameStarter {
	
	/** 允许状态 */
	public volatile static boolean run = true;
	
	public static void main(String[] args) throws Exception {
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
		 //创建MBean  
        ControllerMBean controller = new Controller();  
        
        //将MBean注册到MBeanServer中  
        mbs.registerMBean(controller, new ObjectName("GameMBean:name=controller"));  

        //模拟不停运行
        while(run) {
        	Thread.sleep(500);
        }
        System.err.println("服务关闭成功!!");
	}

}
其中ObjectName的作用是用于唯一标识具体MBean对象,稍后在gui工具就可以看到。


4. 游戏进程运行后,使用jdk自带的工具jconsole.exe(相对路径为Java/jdk1.8.0_45/bin),选择该进程



5. 将jconsole切换到mbean页签,如图



6.再点击我们创建的controler mbean下的属性按钮,可以立即看到我们所测试的两个监控指标的值,是不是非常神奇!!


7.点击操作按钮,即可看到我们为游戏进程所埋下的操作方法。选择指定方法所在的按钮,就可以触发游戏进程的方法调用了!!



8. 例如我们在 exceScript方框内输入123参数后,点执行,可以在程序终端看到打印



9. 除了使用jconsole这个工具,visiualvm也提供了同样功能的插件供下载。jmx还支持使用浏览器作为终端界面。这里就不具体介绍了。

3
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:101498次
    • 积分:1421
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:0篇
    • 译文:0篇
    • 评论:27条
    博客专栏
    最新评论