From e814f2953c268cb4ca12d2a6e0016c841f2362f8 Mon Sep 17 00:00:00 2001 From: lvca Date: Mon, 29 Jun 2015 14:17:24 +0200 Subject: [PATCH] Improved profiling --- .../common/profiler/OAbstractProfiler.java | 66 +++++++++++++--- .../common/profiler/OProfiler.java | 15 ---- .../common/profiler/OProfilerMBean.java | 75 +++++++++---------- .../core/config/OGlobalConfiguration.java | 4 + .../index/hashindex/local/cache/O2QCache.java | 18 ++--- 5 files changed, 106 insertions(+), 72 deletions(-) diff --git a/core/src/main/java/com/orientechnologies/common/profiler/OAbstractProfiler.java b/core/src/main/java/com/orientechnologies/common/profiler/OAbstractProfiler.java index fe37a6b627d..3e4492969d3 100755 --- a/core/src/main/java/com/orientechnologies/common/profiler/OAbstractProfiler.java +++ b/core/src/main/java/com/orientechnologies/common/profiler/OAbstractProfiler.java @@ -33,6 +33,7 @@ import javax.management.MBeanServer; import javax.management.ObjectName; +import java.io.File; import java.io.PrintStream; import java.lang.management.ManagementFactory; import java.util.ArrayList; @@ -54,6 +55,7 @@ public abstract class OAbstractProfiler extends OSharedResourceAbstract implemen protected final ConcurrentHashMap tips = new ConcurrentHashMap(); protected final ConcurrentHashMap tipsTimestamp = new ConcurrentHashMap(); protected long recordingFrom = -1; + protected TimerTask autoDumpTask; public interface OProfilerHookValue { public Object getValue(); @@ -115,9 +117,14 @@ public OAbstractProfiler(final OAbstractProfiler profiler) { Orient.instance().registerWeakOrientStartupListener(this); } - public static void dumpEnvironment(final PrintStream out) { + public static String dumpEnvironment() { + final StringBuilder buffer = new StringBuilder(); + final Runtime runtime = Runtime.getRuntime(); + final long freeSpaceInMB = new File(".").getFreeSpace(); + final long totalSpaceInMB = new File(".").getTotalSpace(); + int stgs = 0; long diskCacheUsed = 0; long diskCacheTotal = 0; @@ -133,22 +140,27 @@ public static void dumpEnvironment(final PrintStream out) { ObjectName osMBeanName = ObjectName.getInstance(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME); if (mbs.isInstanceOf(osMBeanName, "com.sun.management.OperatingSystemMXBean")) { final long osTotalMem = ((Number) mbs.getAttribute(osMBeanName, "TotalPhysicalMemorySize")).longValue(); - final long osUsedMem = ((Number) mbs.getAttribute(osMBeanName, "FreePhysicalMemorySize")).longValue(); + final long osUsedMem = osTotalMem - ((Number) mbs.getAttribute(osMBeanName, "FreePhysicalMemorySize")).longValue(); - out.printf("OrientDB Memory profiler: Heap=%s of %s - DiskCache (%s dbs)=%s of %s - OS=%s of %s\n", + buffer.append(String.format( + "OrientDB Memory profiler: HEAP=%s of %s - DISKCACHE (%s dbs)=%s of %s - OS=%s of %s - FS=%s of %s", OFileUtils.getSizeAsString(runtime.totalMemory() - runtime.freeMemory()), OFileUtils.getSizeAsString(runtime.maxMemory()), stgs, OFileUtils.getSizeAsString(diskCacheUsed), OFileUtils.getSizeAsString(diskCacheTotal), OFileUtils.getSizeAsString(osUsedMem), - OFileUtils.getSizeAsString(osTotalMem)); - return; + OFileUtils.getSizeAsString(osTotalMem), OFileUtils.getSizeAsString(freeSpaceInMB), + OFileUtils.getSizeAsString(totalSpaceInMB))); + return buffer.toString(); } } catch (Exception e) { // Nothing to do. Proceed with default output } - out.printf("OrientDB Memory profiler: Heap=%s of %s - DiskCache (%s dbs)=%s of %s\n", + buffer.append(String.format("OrientDB Memory profiler: Heap=%s of %s - DiskCache (%s dbs)=%s of %s - FS=%s of %s", OFileUtils.getSizeAsString(runtime.totalMemory() - runtime.freeMemory()), OFileUtils.getSizeAsString(runtime.maxMemory()), - stgs, OFileUtils.getSizeAsString(diskCacheUsed), OFileUtils.getSizeAsString(diskCacheTotal)); + stgs, OFileUtils.getSizeAsString(diskCacheUsed), OFileUtils.getSizeAsString(diskCacheTotal), + OFileUtils.getSizeAsString(freeSpaceInMB), OFileUtils.getSizeAsString(totalSpaceInMB))); + + return buffer.toString(); } @Override @@ -213,7 +225,12 @@ public void startup() { @Override public String dump() { - return null; + return dumpEnvironment(); + } + + @Override + public void dump(final PrintStream out) { + out.println(dumpEnvironment()); } @Override @@ -262,7 +279,37 @@ public Date getLastReset() { } @Override - public void setAutoDump(int iNewValue) { + public void setAutoDump(final int iSeconds) { + if (autoDumpTask != null) { + // CANCEL ANY PREVIOUS RUNNING TASK + autoDumpTask.cancel(); + autoDumpTask = null; + } + + if (iSeconds > 0) { + OLogManager.instance().info(this, "Enabled auto dump of profiler every %d second(s)", iSeconds); + + final int ms = iSeconds * 1000; + + autoDumpTask = new TimerTask() { + + @Override + public void run() { + final StringBuilder output = new StringBuilder(); + + output.append("\n*******************************************************************************************************************************************"); + output.append("\nPROFILER AUTO DUMP OUTPUT (to disabled it set 'profiler.autoDump.interval' = 0):\n"); + output.append(dump()); + output.append("\n*******************************************************************************************************************************************"); + + OLogManager.instance().info(null, output.toString()); + } + }; + + Orient.instance().scheduleTask(autoDumpTask, ms, ms); + } else + OLogManager.instance().info(this, "Auto dump of profiler disabled", iSeconds); + } @Override @@ -367,5 +414,4 @@ protected void updateMetadata(final String iName, final String iDescription, fin if (iDescription != null && dictionary.putIfAbsent(iName, iDescription) == null) types.put(iName, iType); } - } diff --git a/core/src/main/java/com/orientechnologies/common/profiler/OProfiler.java b/core/src/main/java/com/orientechnologies/common/profiler/OProfiler.java index c5659cbfac8..77ab5aa1536 100755 --- a/core/src/main/java/com/orientechnologies/common/profiler/OProfiler.java +++ b/core/src/main/java/com/orientechnologies/common/profiler/OProfiler.java @@ -20,7 +20,6 @@ package com.orientechnologies.common.profiler; -import java.io.PrintStream; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -93,16 +92,6 @@ public long getCounter(final String statName) { return stat; } - @Override - public String dump() { - return super.dump(); - } - - @Override - public void dump(final PrintStream out) { - dumpEnvironment(out); - } - @Override public String dumpCounters() { return null; @@ -158,10 +147,6 @@ public Date getLastReset() { return null; } - @Override - public void setAutoDump(int iNewValue) { - } - @Override public String metadataToJSON() { return null; diff --git a/core/src/main/java/com/orientechnologies/common/profiler/OProfilerMBean.java b/core/src/main/java/com/orientechnologies/common/profiler/OProfilerMBean.java index 040edc13a5f..0f55776be0a 100644 --- a/core/src/main/java/com/orientechnologies/common/profiler/OProfilerMBean.java +++ b/core/src/main/java/com/orientechnologies/common/profiler/OProfilerMBean.java @@ -19,82 +19,81 @@ */ package com.orientechnologies.common.profiler; -import com.orientechnologies.common.profiler.OAbstractProfiler.OProfilerHookValue; -import com.orientechnologies.common.util.OPair; -import com.orientechnologies.common.util.OService; - import java.io.PrintStream; import java.util.Date; import java.util.Map; +import com.orientechnologies.common.profiler.OAbstractProfiler.OProfilerHookValue; +import com.orientechnologies.common.util.OPair; +import com.orientechnologies.common.util.OService; + public interface OProfilerMBean extends OService { - public enum METRIC_TYPE { + enum METRIC_TYPE { CHRONO, COUNTER, STAT, SIZE, ENABLED, TEXT } - public void updateCounter(String iStatName, String iDescription, long iPlus); + void updateCounter(String iStatName, String iDescription, long iPlus); - public void updateCounter(String iStatName, String iDescription, long iPlus, String iDictionary); + void updateCounter(String iStatName, String iDescription, long iPlus, String iDictionary); - public long getCounter(String iStatName); + long getCounter(String iStatName); - public String dump(); + String dump(); - public String dumpCounters(); + String dumpCounters(); - public OProfilerEntry getChrono(String string); + OProfilerEntry getChrono(String string); - public long startChrono(); + long startChrono(); - public long stopChrono(String iName, String iDescription, long iStartTime); + long stopChrono(String iName, String iDescription, long iStartTime); - public long stopChrono(String iName, String iDescription, long iStartTime, String iDictionary); + long stopChrono(String iName, String iDescription, long iStartTime, String iDictionary); - public long stopChrono(String iName, String iDescription, long iStartTime, String iDictionary, String payload); + long stopChrono(String iName, String iDescription, long iStartTime, String iDictionary, String payload); - public long stopChrono(String iName, String iDescription, long iStartTime, String iDictionary, String payload, String user); + long stopChrono(String iName, String iDescription, long iStartTime, String iDictionary, String payload, String user); - public String dumpChronos(); + String dumpChronos(); - public String[] getCountersAsString(); + String[] getCountersAsString(); - public String[] getChronosAsString(); + String[] getChronosAsString(); - public Date getLastReset(); + Date getLastReset(); - public boolean isRecording(); + boolean isRecording(); - public boolean startRecording(); + boolean startRecording(); - public boolean stopRecording(); + boolean stopRecording(); - public void unregisterHookValue(String string); + void unregisterHookValue(String string); - public void configure(String string); + void configure(String string); - public void setAutoDump(int iNewValue); + void setAutoDump(int iNewValue); - public String metadataToJSON(); + String metadataToJSON(); - public Map> getMetadata(); + Map> getMetadata(); - public void registerHookValue(String iName, String iDescription, METRIC_TYPE iType, OProfilerHookValue iHookValue); + void registerHookValue(String iName, String iDescription, METRIC_TYPE iType, OProfilerHookValue iHookValue); - public void registerHookValue(String iName, String iDescription, METRIC_TYPE iType, OProfilerHookValue iHookValue, - String iMetadataName); + void registerHookValue(String iName, String iDescription, METRIC_TYPE iType, OProfilerHookValue iHookValue, String iMetadataName); - public String getSystemMetric(String iMetricName); + String getSystemMetric(String iMetricName); - public String getProcessMetric(String iName); + String getProcessMetric(String iName); - public String getDatabaseMetric(String databaseName, String iName); + String getDatabaseMetric(String databaseName, String iName); - public String toJSON(String command, String iPar1); + String toJSON(String command, String iPar1); - public void resetRealtime(String iText); + void resetRealtime(String iText); - public void dump(PrintStream out); + void dump(PrintStream out); - public int reportTip(String iMessage); + int reportTip(String iMessage); } diff --git a/core/src/main/java/com/orientechnologies/orient/core/config/OGlobalConfiguration.java b/core/src/main/java/com/orientechnologies/orient/core/config/OGlobalConfiguration.java index a8ab992f831..53c3d903d1b 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/config/OGlobalConfiguration.java +++ b/core/src/main/java/com/orientechnologies/orient/core/config/OGlobalConfiguration.java @@ -710,6 +710,7 @@ private static void autoConfigDiskCacheSize(final long freeSpaceInMB) { OLogManager.instance().info(null, "OrientDB auto-config DISKCACHE=%,dMB (heap=%,dMB os=%,dMB disk=%,dMB)", diskCacheInMB, jvmMaxMemory / 1024 / 1024, osMemory / 1024 / 1024, freeSpaceInMB); + DISK_CACHE_SIZE.setValue(diskCacheInMB); } else { // LOW MEMORY: SET IT TO 256MB ONLY @@ -720,6 +721,9 @@ private static void autoConfigDiskCacheSize(final long freeSpaceInMB) { "Not enough physical memory available for DISKCACHE: %,dMB (heap=%,dMB). Set lower Maximum Heap (-Xmx setting on JVM) and restart OrientDB. Now running with DISKCACHE=" + O2QCache.MIN_CACHE_SIZE + "MB", osMemory / 1024 / 1024, jvmMaxMemory / 1024 / 1024); DISK_CACHE_SIZE.setValue(O2QCache.MIN_CACHE_SIZE); + + OLogManager.instance().info(null, "OrientDB config DISKCACHE=%,dMB (heap=%,dMB os=%,dMB disk=%,dMB)", diskCacheInMB, + jvmMaxMemory / 1024 / 1024, osMemory / 1024 / 1024, freeSpaceInMB); } } catch (NoSuchMethodException e) { diff --git a/core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/cache/O2QCache.java b/core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/cache/O2QCache.java index af51987ad9b..39f85ed685e 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/cache/O2QCache.java +++ b/core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/cache/O2QCache.java @@ -20,15 +20,6 @@ package com.orientechnologies.orient.core.index.hashindex.local.cache; -import com.orientechnologies.common.concur.lock.ONewLockManager; -import com.orientechnologies.common.concur.lock.OReadersWriterSpinLock; -import com.orientechnologies.common.exception.OException; -import com.orientechnologies.orient.core.exception.OAllCacheEntriesAreUsedException; -import com.orientechnologies.orient.core.exception.OStorageException; -import com.orientechnologies.orient.core.storage.cache.OAbstractWriteCache; -import com.orientechnologies.orient.core.storage.cache.OWriteCache; -import com.orientechnologies.orient.core.storage.impl.local.paginated.base.ODurablePage; - import java.io.IOException; import java.util.Collections; import java.util.NavigableMap; @@ -40,6 +31,15 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; +import com.orientechnologies.common.concur.lock.ONewLockManager; +import com.orientechnologies.common.concur.lock.OReadersWriterSpinLock; +import com.orientechnologies.common.exception.OException; +import com.orientechnologies.orient.core.exception.OAllCacheEntriesAreUsedException; +import com.orientechnologies.orient.core.exception.OStorageException; +import com.orientechnologies.orient.core.storage.cache.OAbstractWriteCache; +import com.orientechnologies.orient.core.storage.cache.OWriteCache; +import com.orientechnologies.orient.core.storage.impl.local.paginated.base.ODurablePage; + /** * @author Andrey Lomakin * @since 7/24/13