使用JMX监控游戏服务器

原创 2017年02月26日 13:32:08

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

前边有一篇文章 (查看生产环境的内存数据),介绍如果通过加载类文件或使用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还支持使用浏览器作为终端界面。这里就不具体介绍了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

手游服务端框架之消息线程模型

玩家的消息请求如果放在mina的io线程池进行处理,当业务处理非常耗时,会严重影响io的吞吐量。所以,我们应该另起用于处理业务逻辑的线程池,采用生产者消费者模型,异步处理玩家请求。

手游服务端框架之GM金手指的设计

游戏开发需要一些命令,能够像金山游侠这种软件一样,修改游戏里的玩家或公共服务的数据。在游戏项目里,这些命令统称为GM命令。本文将介绍实现gm系统的一种方式。

手游服务端框架之使用事件驱动模型解决业务高耦合

游戏里经常有这样的业务,当玩家触发某个动作时,有若干与之关联的业务也要一起执行。诸如这样场景,我们选择引入事件驱动模型来帮助我们解决业务代码耦合的问题。本文实现一个工具库,来解决监听器与事件多对多的关...

游戏开发的艰辛历程与升级展望

从第一款游戏《贪吃蛇》开始,到《水果忍者》、《时空猎人》,再到如今风靡全国的《王者荣耀》,手机游戏迎来了百花齐放的繁华时代。怀着对游戏行业的热爱,一批一批游戏开发大军加入了队伍。即使从业道路很艰辛,我...

再见百田,你好三七

在百田愉快工作了五个月,项目却遭遇了解散。虽然留下遗憾,但未来还有路要走。国庆后,我就要在三七继续奋斗我的青春与汗水。

自定义orm框架解决玩家数据持久化问题

使用持久化框架诸如Hibernate过于重量级,使用原生jdbc又显得非常啰嗦。本文通过几百行代码,演示一个轻量级的持久化框架。可以用于游戏服务端的数据持久化方案。

手游服务端框架之使用Guava构建缓存系统

缓存,在项目中的应用非常之广泛。诸如这样的场景,某些对象计算或者获取的代码比较昂贵,并且在程序里你不止一次要用到这些对象,那么,你就应该使用缓存。缓存,在项目中的应用非常之广泛。诸如这样的场景,某些对...

手游服务端框架之模仿SpringMvc处理玩家请求

经典web开发项目通常采用三层架构来组织代码。典型的,第一层为表现层,通常使用MVC模式;第二层为业务逻辑层,该层主要是各种service业务操作类;第三层则为数据访问层。类似的,我们的游戏项目也可以...

Netty网络聊天室之会话管理

浏览器第一次与服务器建立连接的时候,服务器就会自动为之分配一个Session。在我们的聊天室,也可以使用Session来判断用户是否经过登录验证,保存用户的各种信息,向客户端发送消息。这极大方便了程序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)