diff options
author | Brett Chabot <brettchabot@google.com> | 2014-08-22 22:08:08 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-08-22 22:08:09 +0000 |
commit | af372f5adb59ca6a5b0380e5ee90c5e2d63d72c5 (patch) | |
tree | 291b6995a6ea94fe0cfb79754a2e724a38dc0da9 | |
parent | 94d1a562fafce4db1b2ae4c2a574fc7cd578ed15 (diff) | |
parent | 64a618e817812f19da24b6d2fbae5531ed68bbd0 (diff) | |
download | tradefederation-af372f5adb59ca6a5b0380e5ee90c5e2d63d72c5.tar.gz |
Merge "Switch deviceutilmonitor to use a configurable moving average window."
3 files changed, 32 insertions, 13 deletions
diff --git a/src/com/android/tradefed/device/DeviceUtilStatsMonitor.java b/src/com/android/tradefed/device/DeviceUtilStatsMonitor.java index 476f38b14..1dbf1de95 100644 --- a/src/com/android/tradefed/device/DeviceUtilStatsMonitor.java +++ b/src/com/android/tradefed/device/DeviceUtilStatsMonitor.java @@ -35,9 +35,7 @@ import java.util.TimerTask; */ public class DeviceUtilStatsMonitor implements IDeviceMonitor { - static final int DEFAULT_MAX_SAMPLES = 24 * 60; - - private static final int mInitialDelayMs = 100; + private static final int mInitialDelayMs = 5000; /** * Enum for configuring treatment of stub devices when calculating average host utilization @@ -62,6 +60,14 @@ public class DeviceUtilStatsMonitor implements IDeviceMonitor { "controls if emulator data should be used when calculating avg host utilization") private StubDeviceUtil mCollectEmulator = StubDeviceUtil.INCLUDE_IF_USED; + @Option(name = "sample-window-hours", description = + "the moving average window size to use, in hours") + private int mSampleWindowHours = 8; + + @Option(name = "sample-interval-secs", description = + "the time period between samples, in seconds") + private int mSamplingIntervalSec = 60; + private boolean mNullDeviceAllocated = false; private boolean mEmulatorAllocated = false; @@ -168,11 +174,7 @@ public class DeviceUtilStatsMonitor implements IDeviceMonitor { } } - private int mSamplePeriodMs = 60 * 1000; - - // by default, use 24 hour window - calculated by number of measurement interval (1 min) in - // this window - private int mMaxSamples = DEFAULT_MAX_SAMPLES; + private int mMaxSamples; /** a map of device serial to device records */ private Map<String, DeviceUtilRecord> mDeviceUtilMap = new Hashtable<>(); @@ -180,7 +182,7 @@ public class DeviceUtilStatsMonitor implements IDeviceMonitor { private DeviceLister mDeviceLister; private Timer mTimer; - SamplingTask mSamplingTask = new SamplingTask(); + private SamplingTask mSamplingTask = new SamplingTask(); /** * Get the device utilization up to the last 24 hours @@ -215,8 +217,9 @@ public class DeviceUtilStatsMonitor implements IDeviceMonitor { @Override public void run() { + calculateMaxSamples(); mTimer = new Timer(); - mTimer.scheduleAtFixedRate(mSamplingTask, mInitialDelayMs, mSamplePeriodMs); + mTimer.scheduleAtFixedRate(mSamplingTask, mInitialDelayMs, mSamplingIntervalSec * 1000); } @Override @@ -289,7 +292,21 @@ public class DeviceUtilStatsMonitor implements IDeviceMonitor { return mSamplingTask; } + // @VisibleForTesting + void calculateMaxSamples() { + // find max samples to collect by converting sample window to seconds then divide by + // sampling interval + mMaxSamples = mSampleWindowHours * 60 * 60 / mSamplingIntervalSec; + assert(mMaxSamples > 0); + } + + // @VisibleForTesting void setMaxSamples(int maxSamples) { mMaxSamples = maxSamples; } + + // @VisibleForTesting + int getMaxSamples() { + return mMaxSamples; + } } diff --git a/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorLoadTest.java b/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorLoadTest.java index 0538c9193..6d20a2c56 100644 --- a/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorLoadTest.java +++ b/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorLoadTest.java @@ -52,6 +52,7 @@ public class DeviceUtilStatsMonitorLoadTest extends TestCase { return mMockDeviceManager.listAllDevices(); } }); + mDeviceUtilMonitor.calculateMaxSamples(); } /** @@ -70,12 +71,12 @@ public class DeviceUtilStatsMonitorLoadTest extends TestCase { EasyMock.expect(mMockDeviceManager.listAllDevices()).andStubReturn(deviceList); EasyMock.replay(mMockDeviceManager); - for (int i = 0; i < DeviceUtilStatsMonitor.DEFAULT_MAX_SAMPLES; i++) { + for (int i = 0; i < mDeviceUtilMonitor.getMaxSamples(); i++) { mDeviceUtilMonitor.getSamplingTask().run(); } - // This takes ~ 5.7 MB in heap if DeviceUtilStatsMonitor uses a LinkedList<Byte> to + // This takes ~ 1.9 MB in heap if DeviceUtilStatsMonitor uses a LinkedList<Byte> to // store samples - // takes ~ 270K if CircularByteArray is used + // takes ~ 65K if CircularByteArray is used Thread.sleep(5 * 60 * 1000); } diff --git a/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorTest.java b/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorTest.java index bfd953cb6..0ce265211 100644 --- a/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorTest.java +++ b/tests/src/com/android/tradefed/device/DeviceUtilStatsMonitorTest.java @@ -49,6 +49,7 @@ public class DeviceUtilStatsMonitorTest extends TestCase { return mMockDeviceManager.listAllDevices(); } }); + mDeviceUtilMonitor.calculateMaxSamples(); } public void testEmpty() { |