Mercurial > hg > release > thermostat-1.4
changeset 1844:53fa7cb7fe48
Fix computation of GC time
PR 2789
Reviewed-by: jerboaa
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-January/017412.html
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Fri, 15 Jan 2016 11:16:02 -0500 |
parents | 4823f9e48b7a |
children | d06754b2b04f |
files | vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcDataExtractor.java vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListener.java vm-gc/agent/src/test/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListenerTest.java vm-gc/common/src/main/java/com/redhat/thermostat/vm/gc/common/model/VmGcStat.java |
diffstat | 4 files changed, 37 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcDataExtractor.java Thu Dec 17 17:44:50 2015 -0500 +++ b/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcDataExtractor.java Fri Jan 15 11:16:02 2016 -0500 @@ -81,5 +81,9 @@ return update.getPerformanceCounterLong("sun.gc.collector." + collector + ".invocations"); } + public Long getFrequency() throws VmUpdateException { + return update.getPerformanceCounterLong("sun.os.hrt.frequency"); + } + }
--- a/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListener.java Thu Dec 17 17:44:50 2015 -0500 +++ b/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListener.java Fri Jan 15 11:16:02 2016 -0500 @@ -79,9 +79,12 @@ Long invocations = extractor.getCollectorInvocations(i); if (invocations != null) { Long time = extractor.getCollectorTime(i); - if (time != null) { + Long frequency = extractor.getFrequency(); + if (time != null && frequency!= null) { + // TODO check for overflow + long wallTimeInMicros = ((long) (1.0E6 * time / frequency)); VmGcStat stat = new VmGcStat(writerId, vmId, timestamp, - name, invocations, time); + name, invocations, wallTimeInMicros); gcDAO.putVmGcStat(stat); } else {
--- a/vm-gc/agent/src/test/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListenerTest.java Thu Dec 17 17:44:50 2015 -0500 +++ b/vm-gc/agent/src/test/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListenerTest.java Fri Jan 15 11:16:02 2016 -0500 @@ -45,6 +45,7 @@ import static org.mockito.Mockito.when; import java.util.List; +import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; @@ -55,6 +56,9 @@ import com.redhat.thermostat.vm.gc.common.model.VmGcStat; public class VmGcVmListenerTest { + + private static final long OS_TICKS_PER_SECOND = 1_000_000; + private static final String[] GC_NAMES = new String[] { "GC1", "GC2" }; private static final Long[] GC_INVOCS = new Long[] { 500L, 1000L }; private static final Long[] GC_TIMES = new Long[] { 5000L, 10000L }; @@ -77,6 +81,7 @@ mockCollectorTime(i); } + when(extractor.getFrequency()).thenReturn(OS_TICKS_PER_SECOND); when(extractor.getTotalCollectors()).thenReturn((long) GC_NAMES.length); } @@ -165,5 +170,21 @@ vmListener.recordGcStat(extractor); verify(vmGcStatDAO, never()).putVmGcStat(any(VmGcStat.class)); } + + @Test + public void testRecordMemoryFrequencyMismatch() throws VmUpdateException { + final long SOME_FREQUENCY = 100l; + when(extractor.getFrequency()).thenReturn(SOME_FREQUENCY); + vmListener.recordGcStat(extractor); + ArgumentCaptor<VmGcStat> captor = ArgumentCaptor.forClass(VmGcStat.class); + verify(vmGcStatDAO, times(2)).putVmGcStat(captor.capture()); + List<VmGcStat> gcStats = captor.getAllValues(); + + VmGcStat stat = gcStats.get(0); + assertEquals(GC_NAMES[0], stat.getCollectorName()); + assertEquals(GC_INVOCS[0], (Long) stat.getRunCount()); + assertEquals(TimeUnit.SECONDS.toMicros(GC_TIMES[0]/SOME_FREQUENCY), stat.getWallTime()); + } + }
--- a/vm-gc/common/src/main/java/com/redhat/thermostat/vm/gc/common/model/VmGcStat.java Thu Dec 17 17:44:50 2015 -0500 +++ b/vm-gc/common/src/main/java/com/redhat/thermostat/vm/gc/common/model/VmGcStat.java Fri Jan 15 11:16:02 2016 -0500 @@ -48,19 +48,19 @@ private String vmId; private String collectorName; private long runCount; - private long wallTime; + private long wallTimeInMicros; public VmGcStat() { super(null); } - public VmGcStat(String writerId, String vmId, long timestamp, String collectorName, long runCount, long wallTime) { + public VmGcStat(String writerId, String vmId, long timestamp, String collectorName, long runCount, long wallTimeInMicros) { super(writerId); this.timeStamp = timestamp; this.vmId = vmId; this.collectorName = collectorName; this.runCount = runCount; - this.wallTime = wallTime; + this.wallTimeInMicros = wallTimeInMicros; } @Persist @@ -93,14 +93,15 @@ this.runCount = runCount; } + /** In microseconds */ @Persist public long getWallTime() { - return wallTime; + return wallTimeInMicros; } @Persist - public void setWallTime(long wallTime) { - this.wallTime = wallTime; + public void setWallTime(long wallTimeInMicros) { + this.wallTimeInMicros = wallTimeInMicros; } @Override