并发性能计数器模块
来源:互联网 发布:通达信编程 编辑:程序博客网 时间:2024/05/02 00:29
请先阅读 REFER: http://blog.csdn.net/tenebaul/article/details/17144059
涉及的类: ConcurrentPerformanceBenchmarkFactory.java ConcurrentPerformanceBenchmark.java和ConcurrentPerformanceBenchmarkMBean.java 和 JmxMBeanManager.java
public interface ConcurrentPerformanceBenchmarkMBean { public String getName(); /** 执行的开始时间 yyyy-MM-dd HH:mm:ss*/ public String getInitActionTime(); /** 执行的结束时间 yyyy-MM-dd HH:mm:ss */ public String getLastActionTime(); /** 总共处理了多少个 */ public int getCountTotal(); /** 模拟引擎平均时延 */ public double getLatencyAvgMS(); /** 模拟引擎吞吐量*/ public int getThroughputQPS(); /** * 模拟引擎平均时延的倒数,只是为给平均时延代表的数量级变换成处理能力。 * getThroughputQPS()与getLatencyFlipQPS()的差距体现的是并发带来的好处。 * */ public int getLatencyFlipQPS();}
import java.sql.Date;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicLong;import com.sohu.video.ad.adfront.util.DateUtil;/** 性能测试 */public class ConcurrentPerformanceBenchmark implements ConcurrentPerformanceBenchmarkMBean { private final AtomicInteger totalCount = new AtomicInteger(0); private final AtomicLong totalLatency = new AtomicLong(0); private final String name; public ConcurrentPerformanceBenchmark(String name) { super(); this.name = name; JmxMBeanManager.getInstance().appendMBean(this, name); } public void benchmarkAction(int actionIncrValue, long actionStartTime, long actionEndedTime) { initIfAbsent(actionStartTime); lastEndedTime(actionEndedTime); incrCountAndLatency(actionIncrValue, actionEndedTime-actionStartTime); } private volatile long initActionStartTime = 0;//只写一次 private final AtomicLong lastActionEndedTime = new AtomicLong(); protected void initIfAbsent(long initExecTime) { if (initActionStartTime <= 0) { initActionStartTime = initExecTime; } } protected void lastEndedTime(long lastExecTime) { lastActionEndedTime.set(lastExecTime); } public void incrCountAndLatency(int incrValue, long timeCost) { totalCount.addAndGet(incrValue); totalLatency.addAndGet(timeCost); } @Override public String getName() { return name; } @Override public int getCountTotal() { return totalCount.get(); } @Override public double getLatencyAvgMS() { int num = totalCount.get(); if (num <=0) { return 0; } return (totalLatency.get()+0.0) / totalCount.get(); } @Override public int getLatencyFlipQPS() { long time = totalLatency.get(); if (time <=0) { return 0; } return (int) ((totalCount.get()/(totalLatency.get()+0.0))*1000); } @Override public String getInitActionTime() { if (initActionStartTime <= 0) { return ""; } return DateUtil.format(new Date(initActionStartTime), "yyyy-MM-dd HH:mm:ss"); } @Override public String getLastActionTime() { if (lastActionEndedTime.get() <= 0) { return ""; } return DateUtil.format(new Date(lastActionEndedTime.get()), "yyyy-MM-dd HH:mm:ss"); } @Override public int getThroughputQPS() { if (initActionStartTime <= 0 || lastActionEndedTime.get() <= 0) { return 0; } return (int) (totalCount.get() / ((lastActionEndedTime.get()-initActionStartTime) / 1000.0) ); }}
import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.locks.ReentrantLock;public class ConcurrentPerformanceBenchmarkFactory { private static final ConcurrentHashMap<String, ConcurrentPerformanceBenchmark> container = new ConcurrentHashMap<String, ConcurrentPerformanceBenchmark>(); @SuppressWarnings("rawtypes") public static ConcurrentPerformanceBenchmark getBenchmark(Class className) { return getBenchmark(className, true); } @SuppressWarnings("rawtypes") public static ConcurrentPerformanceBenchmark getBenchmark(Class className, boolean bySimpleName) { return getBenchmark(bySimpleName ? className.getSimpleName() : className.getName()); } public static ConcurrentPerformanceBenchmark getBenchmark(String name) { ConcurrentPerformanceBenchmark cpb = container.get(name); if (cpb != null) { return cpb; } /* ConcurrentPerformanceBenchmark 会加入JMX,属于昂贵对象,引入替身 */ ReentrantLock stuntman = getStuntmanInstanceByName(name); try { stuntman.lock(); cpb = container.get(name); if (cpb == null) {//Double-check ConcurrentPerformanceBenchmark cpbNew = new ConcurrentPerformanceBenchmark(name); ConcurrentPerformanceBenchmark cpbPre = container.putIfAbsent(name, cpbNew); if (cpbPre != null) {//不可能发生的,因为有锁 throw new IllegalStateException("Concurrent Error ConcurrentPerformanceBenchmark"); } else { cpb = cpbNew; } } return cpb; } finally { stuntman.unlock(); } } private static final ConcurrentHashMap<String, ReentrantLock> stuntmanContainer = new ConcurrentHashMap<String,ReentrantLock>(); private static ReentrantLock getStuntmanInstanceByName(String name) { ReentrantLock stuntman = stuntmanContainer.get(name); if (stuntman == null) { ReentrantLock newStuntman = new ReentrantLock(); ReentrantLock preStuntman = stuntmanContainer.putIfAbsent(name, newStuntman); stuntman = (preStuntman!=null ? preStuntman : newStuntman); } return stuntman; }}
import java.lang.management.ManagementFactory;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.atomic.AtomicInteger;import javax.management.MBeanServer;import javax.management.ObjectName;public class JmxMBeanManager { private static final Object mbsCreateMonitor = new Object(); private static JmxMBeanManager thisObj; private final MBeanServer mbs; public JmxMBeanManager() { mbs = ManagementFactory.getPlatformMBeanServer(); } public static JmxMBeanManager getInstance() { synchronized (mbsCreateMonitor) { if (null == thisObj) { thisObj = new JmxMBeanManager(); } } return thisObj; } public boolean isRegistered(String name) { try { ObjectName objName = new ObjectName(name); return mbs.isRegistered(objName); } catch (Exception e) { throw new RuntimeException("exception while checking if MBean is registered, " + name, e); } } /** 记录每个类产生的实例的个数 */ @SuppressWarnings("rawtypes") private final ConcurrentHashMap<Class, AtomicInteger> classInstanceCounter = new ConcurrentHashMap<Class, AtomicInteger>(); @SuppressWarnings("rawtypes") private int incrAndGet(Class Key) { return incrAndGet(Key, 1); } @SuppressWarnings("rawtypes") private int incrAndGet(Class key, final int incrValue) { AtomicInteger bookIdCount = classInstanceCounter.get(key); if (bookIdCount == null) { AtomicInteger bookIdPrev = classInstanceCounter.putIfAbsent(key, new AtomicInteger(incrValue)); if (bookIdPrev != null) { return bookIdPrev.addAndGet(incrValue); } else { return incrValue; } } else { return bookIdCount.addAndGet(incrValue); } } public void appendMBean(Object theBean) { appendMBean(theBean, null, 5); } /** * @param simpleName NULL的时,系统自动提取类名简称。 * */ public void appendMBean(Object theBean, String simpleName) { if (simpleName == null || simpleName.length() > 15) { throw new IllegalArgumentException(); } appendMBean(theBean,simpleName, -1); } public void appendMBean(Object theBean, String simpleName, int prefix) { String beanName = genBeanName(theBean, simpleName, prefix); if (JmxMBeanManager.getInstance().isRegistered(beanName)) { JmxMBeanManager.getInstance().unregisterMBean(beanName); } JmxMBeanManager.getInstance().registerMBean(theBean, beanName); } @SuppressWarnings("rawtypes") protected String genBeanName(Object theBean, String simpleName, int prefix) { Class beanClass = theBean.getClass(); String prefixName = (prefix < 0 ? beanClass.getName() : packagePrefix(beanClass, prefix)); String typeName = (simpleName==null ? beanClass.getSimpleName() : simpleName );// String prefixName = beanClass.getName();// String typeName = beanClass.getSimpleName(); int instanceNum = incrAndGet(beanClass); String beanName = prefixName+":type="+typeName+ "-" + instanceNum;; return beanName; } private static String packagePrefix(String className, int maxDot) { int fromIndex = -1; int lastIndex = 0; int iteration = 0; do { lastIndex = fromIndex; fromIndex = className.indexOf(".", fromIndex+1); iteration ++; } while (iteration < maxDot && fromIndex!=-1); if (lastIndex <= 0) { return className; } return className.substring(0,lastIndex); } @SuppressWarnings("rawtypes") private static String packagePrefix(Class classArg, int maxDot) { return packagePrefix(classArg.getName(), maxDot); } private void registerMBean(Object theBean, String name) { try { ObjectName objName = new ObjectName(name); mbs.registerMBean(theBean, objName); } catch (Exception e) { throw new RuntimeException("exception while registering MBean, " + name, e); } } private void unregisterMBean(String name) { try { ObjectName objName = new ObjectName(name); mbs.unregisterMBean(objName); } catch (Exception e) { throw new RuntimeException("exception while unregistering MBean, " + name, e); } } public Object getAttribute(String objName, String attrName) { try { ObjectName on = new ObjectName(objName); return mbs.getAttribute(on, attrName); } catch (Exception e) { throw new RuntimeException("exception while getting MBean attribute, " + objName + ", " + attrName, e); } } public Integer getIntAttribute(String objName, String attrName) { return (Integer) getAttribute(objName, attrName); } public String getStringAttribute(String objName, String attrName) { return (String) getAttribute(objName, attrName); }}
使用DEMO:
ConcurrentPerformanceBenchmark benchmarkParse = ConcurrentPerformanceBenchmarkFactory.getBenchmark("RDBLoaderParse"); ConcurrentPerformanceBenchmark benchmarkStore = ConcurrentPerformanceBenchmarkFactory.getBenchmark("RDBLoaderStore"); try { Entry entry = rdb.next(); while (entry != null) { long st = SystemClock.systemCurrentTimeMillis(); if (entry.value != null) {//过滤机制的存在,可能VALUE为空 freqCtrl.set(entry.key, (ConcurrentHashMap<String,FreqCtrlPeriod>)entry.value); } long mt = SystemClock.systemCurrentTimeMillis(); entry = rdb.next(); long et = SystemClock.systemCurrentTimeMillis(); benchmarkStore.benchmarkAction(1, st, mt); benchmarkParse.benchmarkAction(1, mt, et); } } finally { if ( rdb!= null) { rdb.close(); } LOG.info("loaded rdb named {} in {}", rdbFile.getName(), Thread.currentThread().getName()); }
JMX查看性能效果:
0 0
- 并发性能计数器模块
- 计数器模块
- 计数器模块
- 计数器模块
- 多核下的并发计数器的高性能实现
- 实现高性能高并发的计数器功能
- 性能计数器
- 性能计数器
- 性能计数器
- 堆外并发计数器
- java并发计数器问题
- web性能测试3: 组合模块并发性能测试
- MySQL:如何实现高性能高并发的计数器功能(如:网站点击数)
- 微软企业库4.1学习笔记(二十)缓存模块8 性能计数器
- 性能计数器解释
- 系统性能计数器
- 性能计数器参考
- Windows 性能计数器
- AVCapture中实现拉近拉远镜头
- MySQL处理千万级数据查询分页
- 汇编语言的冒泡排序和二分法
- 认识java.lang.Runtime类
- Win8 WiFi共享设置
- 并发性能计数器模块
- F1Book使用总结
- 解决: 用代码改变listview的item背景色时,点击一个item,每隔几个item背景色重复
- 使用mysql dump 导入与导出的方法
- ArcGIS Engine Style文件操作
- Windows Azure 功能更新:可用性99.99+%的容灾站点只读访问,调度服务,监控服务改进
- ExtJS中的TreeStore如何添加json格式的数据
- 网络抓包工具fidder
- Java Interface 是常量存放的最佳地点吗?