/** * (C) Copyright IBM Corp. 2010, 2015 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *  */ package com.ibm.bi.dml.runtime.controlprogram.caching; import java.util.concurrent.atomic.AtomicLong; /** * This singleton provides basic caching statistics in CP. * * 1) Hit statistics for caching (mem, fs, hdfs, total) * * NOTE: In order to provide accurate statistics in multi-threaded * synchronized increments are required. Since those functions are * called potentially very often, we use atomic increments * (compare and swap) instead of heavy-weight 'synchronized' methods. * */ public class CacheStatistics { //enum used for MR counters public enum Stat { CACHE_HITS_MEM, CACHE_HITS_FSBUFF, CACHE_HITS_FS, CACHE_HITS_HDFS, CACHE_WRITES_FSBUFF, CACHE_WRITES_FS, CACHE_WRITES_HDFS, CACHE_TIME_ACQR, //acquire read CACHE_TIME_ACQM, //acquire read CACHE_TIME_RLS, //release CACHE_TIME_EXP, //export } //hit statistics (for acquire read) private static AtomicLong _numHitsTotal = null; private static AtomicLong _numHitsMem = null; private static AtomicLong _numHitsFSBuff = null; private static AtomicLong _numHitsFS = null; private static AtomicLong _numHitsHDFS = null; //write statistics caching private static AtomicLong _numWritesFSBuff = null; private static AtomicLong _numWritesFS = null; private static AtomicLong _numWritesHDFS = null; //time statistics caching private static AtomicLong _ctimeAcquireR = null; //in nano sec private static AtomicLong _ctimeAcquireM = null; //in nano sec private static AtomicLong _ctimeRelease = null; //in nano sec private static AtomicLong _ctimeExport = null; //in nano sec static { reset(); } public static void reset() { _numHitsTotal = new AtomicLong(0); _numHitsMem = new AtomicLong(0); _numHitsFSBuff = new AtomicLong(0); _numHitsFS = new AtomicLong(0); _numHitsHDFS = new AtomicLong(0); _numWritesFSBuff = new AtomicLong(0); _numWritesFS = new AtomicLong(0); _numWritesHDFS = new AtomicLong(0); _ctimeAcquireR = new AtomicLong(0); _ctimeAcquireM = new AtomicLong(0); _ctimeRelease = new AtomicLong(0); _ctimeExport = new AtomicLong(0); } public static void incrementTotalHits() { _numHitsTotal.incrementAndGet(); } public static void incrementTotalHits(int delta) { _numHitsTotal.addAndGet(delta); } public static long getTotalHits() { return _numHitsTotal.get(); } public static void incrementMemHits() { _numHitsMem.incrementAndGet(); } public static void incrementMemHits(int delta) { _numHitsMem.addAndGet(delta); } public static long getMemHits() { return _numHitsMem.get(); } public static void incrementFSBuffHits() { _numHitsFSBuff.incrementAndGet(); } public static void incrementFSBuffHits( int delta ) { _numHitsFSBuff.addAndGet(delta); } public static long getFSBuffHits() { return _numHitsFSBuff.get(); } public static void incrementFSHits() { _numHitsFS.incrementAndGet(); } public static void incrementFSHits(int delta) { _numHitsFS.addAndGet(delta); } public static long getFSHits() { return _numHitsFS.get(); } public static void incrementHDFSHits() { _numHitsHDFS.incrementAndGet(); } public static void incrementHDFSHits(int delta) { _numHitsHDFS.addAndGet(delta); } public static long getHDFSHits() { return _numHitsHDFS.get(); } public static void incrementFSBuffWrites() { _numWritesFSBuff.incrementAndGet(); } public static void incrementFSBuffWrites(int delta) { _numWritesFSBuff.addAndGet(delta); } public static long getFSBuffWrites() { return _numWritesFSBuff.get(); } public static void incrementFSWrites() { _numWritesFS.incrementAndGet(); } public static void incrementFSWrites(int delta) { _numWritesFS.addAndGet(delta); } public static long getFSWrites() { return _numWritesFS.get(); } public static void incrementHDFSWrites() { _numWritesHDFS.incrementAndGet(); } public static void incrementHDFSWrites(int delta) { _numWritesHDFS.addAndGet(delta); } public static long getHDFSWrites() { return _numWritesHDFS.get(); } public static void incrementAcquireRTime(long delta) { _ctimeAcquireR.addAndGet(delta); } public static long getAcquireRTime() { return _ctimeAcquireR.get(); } public static void incrementAcquireMTime(long delta) { _ctimeAcquireM.addAndGet(delta); } public static long getAcquireMTime() { return _ctimeAcquireM.get(); } public static void incrementReleaseTime(long delta) { _ctimeRelease.addAndGet(delta); } public static long getReleaseTime() { return _ctimeRelease.get(); } public static void incrementExportTime(long delta) { _ctimeExport.addAndGet(delta); } public static long getExportTime() { return _ctimeExport.get(); } public static String displayHits() { StringBuilder sb = new StringBuilder(); sb.append(_numHitsMem.get()); sb.append("/"); sb.append(_numHitsFSBuff.get()); sb.append("/"); sb.append(_numHitsFS.get()); sb.append("/"); sb.append(_numHitsHDFS.get()); return sb.toString(); } public static String displayWrites() { StringBuilder sb = new StringBuilder(); sb.append(_numWritesFSBuff.get()); sb.append("/"); sb.append(_numWritesFS.get()); sb.append("/"); sb.append(_numWritesHDFS.get()); return sb.toString(); } public static String displayTime() { StringBuilder sb = new StringBuilder(); sb.append(String.format("%.3f", ((double)_ctimeAcquireR.get())/1000000000)); //in sec sb.append("/"); sb.append(String.format("%.3f", ((double)_ctimeAcquireM.get())/1000000000)); //in sec sb.append("/"); sb.append(String.format("%.3f", ((double)_ctimeRelease.get())/1000000000)); //in sec sb.append("/"); sb.append(String.format("%.3f", ((double)_ctimeExport.get())/1000000000)); //in sec ; return sb.toString(); } }