`

【zk开发】zk内存监控

    博客分类:
  • ZK
阅读更多

 

所用到的资源  见附件

 

log4j.properties

log4j-1.2.15.jar

slf4j-log4j12-1.5.0.jar 

slf4j-api-1.5.0.jar 

commons-lang-2.4.jar 

 

 一,zk内存监控要点: 

Monitor接口是zk提供的zk Engine监听工具, 如果在zk.xml有该配置,zk将在桌面的创建销毁,会话的创建销毁,

以及异步更新时回调相关方法,从而可以统计会话,桌面,更新的数量等等

 

         大致流程:实现该Monitor,的异步更新方法 -> 配置zk.xml中的monitor监听器以及log4j日志项

 

                        ->添加zul视图,以及视图控制器 -> 测试

 

 

 

 二,memory Monitor的的实现

 

     1,Monitor的空实现,方便继承,不必关心不感兴趣的方法

 

package org.zkway.util.zk;

import java.util.List;

import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.util.Monitor;

/**
 * 该类仅仅提供Monitor的空实现
 * 
 * <p>
 * Monitor类是zk提供的zk Engine监听工具, 通常用于统计会话,桌面,更新的数量
 * 
 * @author sunflower
 * 
 */
abstract public class AbstractMonitor implements Monitor {
	/**
	 * 当异步更新之后调用
	 * <p>
	 * 所谓的更新,其实可以理解为一个异步事件请求, 并不是所有的事件请求都会更新客户端视图, 只是在需要时才修改
	 */
	@Override
	public void afterUpdate(Desktop desktop) {

	}

	/**
	 * 当异步更新之前调用
	 * <p>
	 * 所谓的更新,其实可以理解为一个异步事件请求, 并不是所有的事件请求都会更新客户端视图, 只是在需要时才修改
	 */
	@Override
	public void beforeUpdate(Desktop desktop, List requests) {

	}

	/**
	 * 当创建新 桌面 的时候调用
	 * 
	 */
	@Override
	public void desktopCreated(Desktop desktop) {

	}

	/**
	 * 当桌面销毁时创建
	 */
	@Override
	public void desktopDestroyed(Desktop desktop) {

	}

	/**
	 * 当创建新的session时调用
	 */
	@Override
	public void sessionCreated(Session sess) {

	}

	/**
	 * 当session销毁时调用
	 */
	@Override
	public void sessionDestroyed(Session sess) {

	}

}

 

 

    2,memory Monitor的的实现

 

package org.zkway.util.zk;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.zk.au.AuRequest;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.IdSpace;
import org.zkoss.zk.ui.sys.ExecutionCtrl;

/**
 * Zkway内存变化统计
 * <p>
 * 仅监视客户操作的内存变化情况
 * 
 * @author sunflower
 * 
 */
public class ZkwayMemoryStatistic extends AbstractMonitor {
	static Logger log = LoggerFactory.getLogger(ZkwayMemoryStatistic.class);
	/**
	 * 常量标识符,标识当前请求作用域内beforeUpdate时的内存大小
	 */
	private static final String REQUEST_MEMORY = "org.zkway.zk.constants.requestMemory";

	@Override
	public synchronized void beforeUpdate(Desktop desktop, List requests) {
		ExecutionCtrl ec = (ExecutionCtrl) Executions.getCurrent();
		List<AuRequest> reqs = (List<AuRequest>) requests;
		long memory = Runtime.getRuntime().freeMemory();
		Executions.getCurrent().setAttribute(REQUEST_MEMORY, memory);

		for (AuRequest auq : reqs) {
			auq.activate(); // 激活request,给AuRequest component和page属性赋值,方便下面使用
			log.debug("【beforeUpdate】[{}]  \tmemory [{}] kb \t{}({}) \tcmd [{}] \tPage [{}]",
							new Object[] {
									Executions.getCurrent().getRemoteAddr(),
									memory / 1024,
									auq.getComponent().getDefinition()
											.getName(),
									auq.getComponent().getId(),
									auq.getCommand(),
									getCompPath(auq.getComponent()) });
		}
	}

	/**
	 * 获得组件的路径
	 * 
	 * @param comp
	 *            zk组件
	 * @return 组件的路径
	 */
	private String getCompPath(Component comp) {
		StringBuilder sb = new StringBuilder();
		Component current = comp;
		while (current != null) {
			if ((current instanceof IdSpace)
					&& StringUtils.isNotBlank(current.getId())) {
				sb.append(" -> ").append(current.getDefinition().getName())
						.append("(").append(current.getId()).append(")");
			} else {
				sb.append(" -> ").append(current.getDefinition().getName());
			}
			current = current.getParent();
		}
		sb.append(" ->文件").append(comp.getPage().getRequestPath());
		return sb.toString();
	}

	@Override
	public synchronized void afterUpdate(Desktop desktop) {
		ExecutionCtrl ec = (ExecutionCtrl) Executions.getCurrent();
		long memory = (Long) Executions.getCurrent().getAttribute(
				REQUEST_MEMORY);
		long m = memory - Runtime.getRuntime().freeMemory();
		memory = memory - m;
		log
				.debug(
						"【afterUpdate 】[{}]  \tmemory [{}] kb \tdecrease [{}] kb \tPage [{}] ",
						new Object[] {Executions.getCurrent().getRemoteAddr(), memory / 1024, m / 1024,
								ec.getCurrentPage().getRequestPath() });
	}

}
 

 

 

 

二,配置zk.xml,添加monitor监听器

 

 

 

  <!-- Optional -->

	<!--
		the following listener is used to see # of sessions, desktops...
	-->
	<listener>
		<description>[Optional] Mointor the statistic</description>
		<listener-class> org.zkway.util.zk.ZkwayMemoryStatistic</listener-class>
	</listener>

 

 

三,添加视图页面,控制器,测试

 

 

 

 

<window id="indexWin" xmlns:h="http://www.w3.org/1999/xhtml"
	xmlns:n="http://www.zkoss.org/2005/zk/native" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:ca="http://www.zkoss.org/2005/zk/client/attribute"
	apply="org.zkway.ctrl.IndexController">
	<!-- borderlayout如果有父节点,那么必须设置height属性,否则不显示 -->
	<borderlayout height="1800px">
		<!-- 北(上) -->
		<north height="100px" style="background-image:url(images/bg.png);">
			<div>
				<button forward="onTestMemory" id="btnTestMemory" label="test memory" />
			</div>
		</north>

 

 

 

 

import java.util.HashMap;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericComposer;

public class IndexController extends GenericComposer {
	private static final long serialVersionUID = -3801962286418473844L;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
	}

	public void onTestMemory() {
		for (int i = 0; i < 1000; i++)
			new HashMap(100);
	}
}

 

 

 

 

监控记录

 

 

 

【beforeUpdate】[127.0.0.1] memory [7105] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]

【afterUpdate 】[127.0.0.1] memory [7098] kb decrease [7] kb Page [//WEB-INF/content/index.zul] 

【beforeUpdate】[127.0.0.1] memory [7052] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]

【afterUpdate 】[127.0.0.1] memory [7045] kb decrease [6] kb Page [/WEB-INF/content/welcome.zul] 

【beforeUpdate】[127.0.0.1] memory [7006] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]

【afterUpdate 】[127.0.0.1] memory [6999] kb decrease [6] kb Page [//WEB-INF/content/index.zul] 

【beforeUpdate】[127.0.0.1] memory [6953] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]

【afterUpdate 】[127.0.0.1] memory [6946] kb decrease [7] kb Page [/WEB-INF/content/welcome.zul] 

【beforeUpdate】[127.0.0.1] memory [8579] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]

【afterUpdate 】[127.0.0.1] memory [8568] kb decrease [10] kb Page [//WEB-INF/content/index.zul] 

【beforeUpdate】[127.0.0.1] memory [8525] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]

【afterUpdate 】[127.0.0.1] memory [8520] kb decrease [5] kb Page [/WEB-INF/content/welcome.zul] 

【beforeUpdate】[127.0.0.1] memory [8477] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]

【afterUpdate 】[127.0.0.1] memory [8471] kb decrease [6] kb Page [//WEB-INF/content/index.zul] 

【beforeUpdate】[127.0.0.1] memory [8428] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]

【afterUpdate 】[127.0.0.1] memory [8422] kb decrease [5] kb Page [/WEB-INF/content/welcome.zul] 


 

 

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    zk框架开发帮助文档

    这个"zk框架开发帮助文档"显然是为了指导开发者如何有效地利用Zookeeper进行系统设计和开发。 一、Zookeeper基本概念 1. 节点(Znode):Zookeeper数据存储的基本单元,类似于文件系统中的文件或目录。每个节点都有...

    zk-manager.zip

    4. 监控告警:实时监控Zookeeper的运行状态,如CPU、内存使用情况,以及异常事件告警,确保服务稳定运行。 5. 日志查看:提供查看和下载Zookeeper服务器日志的功能,便于问题排查。 在源代码中,我们可以通过以下几...

    Go-zk-sniffer使用golang嗅探和解析ZooKeeper数据包

    Go-zk-sniffer就是这样一款基于Golang开发的工具,专门用于嗅探和解析ZooKeeper的数据包,为开发者提供了一种深入洞察ZooKeeper网络通信的途径。 首先,我们来了解下ZooKeeper的主要功能。ZooKeeper是一个分布式的...

    ZK源代码下载版本3.07(ZK.src)

    10. **性能优化**:ZK通过批量操作、数据压缩、内存数据缓存等手段提高性能,以应对大规模的并发请求。 深入研究ZK 3.0.7的源代码,不仅可以理解其内部的工作原理,也可以为自定义扩展和优化提供基础,对于从事...

    zookeeper集群监控工具taokeeper

    5. **CPU和内存使用率**: 监控Zookeeper服务器的资源消耗,预防资源耗尽导致的服务中断。 6. **网络延迟和吞吐量**: 评估网络状况,避免网络瓶颈影响服务性能。 7. **日志和错误分析**: 通过日志发现潜在问题,...

    zkex内存遍历工具

    在游戏开发和调试中,内存遍历工具往往被用来检测游戏状态、寻找作弊码或优化游戏性能。它们可以搜索内存中特定数值,比如玩家的生命值、分数或其他关键属性,以便于理解和调整游戏逻辑。对于开发者来说,这样的工具...

    识别模块源程序_ZK-11语音识别模块_sinkfdn_

    ZK-11语音识别模块是一款专为实现语音控制和交互而设计的硬件设备,通常用于智能家居、智能车载系统、安防监控等应用场景。其核心功能是将人类的语音命令转化为机器可理解的数字信号,从而实现对其他设备的控制或...

    zk3.4.5.tar.gz&zk3.4.10.tar.gz&zk3.4.14.tar.gz

    同时,这个版本还对内存管理和数据存储进行了优化,降低了内存占用,提升了读写速度。此外,安全方面也得到了加强,支持了SASL(Simple Authentication and Security Layer)协议,提高了系统的安全性。 最后,...

    42_分布式锁是啥?对比下redis和zk两种分布式锁的优劣?.zip

    在Java开发中,分布式锁的应用广泛,尤其是在微服务架构中,当服务间的通信可能导致对同一资源的并发访问时,分布式锁能确保操作的原子性和一致性。 **Redis与Zookeeper分布式锁对比** 1. **Redis分布式锁** - **...

    zk-shell-rs:Rust中的ZooKeeper外壳

    5. **安全性**:Rust 语言的特性使得 `zk-shell-rs` 在处理敏感的 ZooKeeper 操作时具有良好的内存管理和安全性,减少了潜在的内存泄漏和数据损坏风险。 6. **性能优化**:Rust 的高性能特性使得 `zk-shell-rs` ...

    Spring、Java、redis、zk、MySQL等面试题总结

    5. JVM调优:包括堆内存分配、GC算法、性能监控、内存泄漏排查等。 【Redis面试知识点】 1. Redis概述:Redis是一个开源的键值存储系统,常用于高速数据缓存、消息队列等场景。 2. 数据类型:Redis支持字符串、...

    Zookeeper可视化界面工具zkUI

    6. 性能监控:显示服务器的CPU、内存、网络等资源使用情况,帮助评估系统的健康状况和性能瓶颈。 7. 配置管理:允许用户查看和修改Zookeeper服务器的配置,这对于优化集群配置和解决配置错误至关重要。 8. 安全性...

    zk-vote-开源

    9. **监控和日志**:使用Prometheus、Grafana进行性能监控,ELK (Elasticsearch, Logstash, Kibana) 或Graylog进行日志收集和分析。 10. **测试框架**:JUnit、Selenium等,用于编写和执行单元测试和集成测试,保证...

    Zookeeper管理工具

    6. 监控功能:可以实时监控Zookeeper服务器的状态,包括连接数、会话超时、CPU和内存使用情况等。 7. 事件通知:当Zookeeper中的节点发生变化时,Zkui能够及时通知用户,帮助快速定位问题。 8. 快照管理:允许用户...

    天空组态软件免费版

    5、精美的而快速的界面处理技术、最少内存使用、让用户可以开发精美工控画面而实现高效工控软件。 6、作为软硬件生产商、软硬件完美结合、雄厚的技术实力、让用户只专注于工控系统而不是软件本身。 7、内置数据...

    zookeeper 图形管理工具

    4. **可视化**:通过图表展示Zookeeper集群的健康状况,例如节点数量、内存使用情况、会话状态等,帮助管理员实时监控集群状态。 5. **权限管理**:支持配置权限,对不同用户或角色赋予不同的访问权限,增强系统...

    zookeeper查看工具

    8. **实时监控**:提供实时的Zookeeper服务器指标监控,包括CPU、内存使用情况,以及网络IO等,有助于及时发现和处理性能瓶颈。 使用zkweb这样的工具,运维人员可以更高效地进行故障排查、配置调整和性能优化,提高...

    Mycat-server-1.6-RELEASE源码

    Mycat关键特性 关键特性 支持SQL92标准 ...支持zookeeper协调主从切换、zk序列、配置zk化(1.6) 支持库内分表(1.6) 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

    exporter部署手册

    Exporter是Prometheus社区开发的一系列工具,它们能够将非Prometheus格式的度量数据转换成Prometheus可以理解的格式。本文主要讨论了如何部署几种常见的Exporter,包括`node_exporter`、`redis_exporter`、`mysql_...

Global site tag (gtag.js) - Google Analytics