Skip to content

Commit

Permalink
Improved profiling
Browse files Browse the repository at this point in the history
  • Loading branch information
lvca committed Jun 29, 2015
1 parent 2754987 commit e814f29
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 72 deletions.
Expand Up @@ -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;
Expand All @@ -54,6 +55,7 @@ public abstract class OAbstractProfiler extends OSharedResourceAbstract implemen
protected final ConcurrentHashMap<String, AtomicInteger> tips = new ConcurrentHashMap<String, AtomicInteger>();
protected final ConcurrentHashMap<String, Long> tipsTimestamp = new ConcurrentHashMap<String, Long>();
protected long recordingFrom = -1;
protected TimerTask autoDumpTask;

public interface OProfilerHookValue {
public Object getValue();
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
}

}
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -158,10 +147,6 @@ public Date getLastReset() {
return null;
}

@Override
public void setAutoDump(int iNewValue) {
}

@Override
public String metadataToJSON() {
return null;
Expand Down
Expand Up @@ -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<String, OPair<String, METRIC_TYPE>> getMetadata();
Map<String, OPair<String, METRIC_TYPE>> 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);
}
Expand Up @@ -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
Expand All @@ -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) {
Expand Down
Expand Up @@ -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;
Expand All @@ -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
Expand Down

0 comments on commit e814f29

Please sign in to comment.