From 5aec0ff207e9427b8756471eb003fd68859f67b1 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 25 Jul 2012 23:27:00 +0100
Subject: Move Watchdog and MemoryWatchdog classes into
OpenSim.Framework.Monitoring with other monitoring code from
OpenSim.Framework
---
OpenSim/Framework/Monitoring/MemoryWatchdog.cs | 129 +++++++++++++++++++++++++
1 file changed, 129 insertions(+)
create mode 100644 OpenSim/Framework/Monitoring/MemoryWatchdog.cs
(limited to 'OpenSim/Framework/Monitoring/MemoryWatchdog.cs')
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
new file mode 100644
index 0000000..6599613
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using log4net;
+
+namespace OpenSim.Framework.Monitoring
+{
+ ///
+ /// Experimental watchdog for memory usage.
+ ///
+ public static class MemoryWatchdog
+ {
+// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ ///
+ /// Is this watchdog active?
+ ///
+ public static bool Enabled
+ {
+ get { return m_enabled; }
+ set
+ {
+// m_log.DebugFormat("[MEMORY WATCHDOG]: Setting MemoryWatchdog.Enabled to {0}", value);
+
+ if (value && !m_enabled)
+ UpdateLastRecord(GC.GetTotalMemory(false), Util.EnvironmentTickCount());
+
+ m_enabled = value;
+ }
+ }
+ private static bool m_enabled;
+
+ ///
+ /// Average memory churn in bytes per millisecond.
+ ///
+ public static double AverageMemoryChurn
+ {
+ get { if (m_samples.Count > 0) return m_samples.Average(); else return 0; }
+ }
+
+ ///
+ /// Maximum number of statistical samples.
+ ///
+ ///
+ /// At the moment this corresponds to 1 minute since the sampling rate is every 2.5 seconds as triggered from
+ /// the main Watchdog.
+ ///
+ private static int m_maxSamples = 24;
+
+ ///
+ /// Time when the watchdog was last updated.
+ ///
+ private static int m_lastUpdateTick;
+
+ ///
+ /// Memory used at time of last watchdog update.
+ ///
+ private static long m_lastUpdateMemory;
+
+ ///
+ /// Memory churn rate per millisecond.
+ ///
+ private static double m_churnRatePerMillisecond;
+
+ ///
+ /// Historical samples for calculating moving average.
+ ///
+ private static Queue m_samples = new Queue(m_maxSamples);
+
+ public static void Update()
+ {
+ int now = Util.EnvironmentTickCount();
+ long memoryNow = GC.GetTotalMemory(false);
+ long memoryDiff = memoryNow - m_lastUpdateMemory;
+
+ if (memoryDiff >= 0)
+ {
+ if (m_samples.Count >= m_maxSamples)
+ m_samples.Dequeue();
+
+ double elapsed = Util.EnvironmentTickCountSubtract(now, m_lastUpdateTick);
+
+ // This should never happen since it's not useful for updates to occur with no time elapsed, but
+ // protect ourselves from a divide-by-zero just in case.
+ if (elapsed == 0)
+ return;
+
+ m_samples.Enqueue(memoryDiff / (double)elapsed);
+ }
+
+ UpdateLastRecord(memoryNow, now);
+ }
+
+ private static void UpdateLastRecord(long memoryNow, int timeNow)
+ {
+ m_lastUpdateMemory = memoryNow;
+ m_lastUpdateTick = timeNow;
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.1
From f3c5ce1bbd86fafa0e436efe5de804b65d64b8af Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 27 Jul 2012 22:20:08 +0100
Subject: minor: Comment out unused MemoryWatchdog.m_churnRatePerMillisecond -
this is currently calculated dynamically
---
OpenSim/Framework/Monitoring/MemoryWatchdog.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Framework/Monitoring/MemoryWatchdog.cs')
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
index 6599613..a23cf1f 100644
--- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -89,7 +89,7 @@ namespace OpenSim.Framework.Monitoring
///
/// Memory churn rate per millisecond.
///
- private static double m_churnRatePerMillisecond;
+// private static double m_churnRatePerMillisecond;
///
/// Historical samples for calculating moving average.
--
cgit v1.1
From 4e5b2346a5700b14687a33175ba54a93960a9d33 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 16 Oct 2012 23:44:52 +0100
Subject: Add LastMemoryChurn stat using existing data so we can more quickly
tell how memory churn changes rather than waiting for the average to move.
---
OpenSim/Framework/Monitoring/MemoryWatchdog.cs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Framework/Monitoring/MemoryWatchdog.cs')
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
index a23cf1f..c6010cd 100644
--- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -60,7 +60,7 @@ namespace OpenSim.Framework.Monitoring
private static bool m_enabled;
///
- /// Average memory churn in bytes per millisecond.
+ /// Last memory churn in bytes per millisecond.
///
public static double AverageMemoryChurn
{
@@ -68,6 +68,14 @@ namespace OpenSim.Framework.Monitoring
}
///
+ /// Average memory churn in bytes per millisecond.
+ ///
+ public static double LastMemoryChurn
+ {
+ get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; }
+ }
+
+ ///
/// Maximum number of statistical samples.
///
///
--
cgit v1.1
From b1b46872500476cf97b5de8c16012b8545fed0c7 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 10 Jan 2013 00:57:49 +0000
Subject: Add "show script timers" command to show script timers. For debug
purposes.
Also, "show sensors" changes to "show script sensors".
---
OpenSim/Framework/Monitoring/MemoryWatchdog.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Framework/Monitoring/MemoryWatchdog.cs')
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
index c6010cd..bc5ed97 100644
--- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -72,7 +72,7 @@ namespace OpenSim.Framework.Monitoring
///
public static double LastMemoryChurn
{
- get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; }
+ get { if (m_samples.Count > 0) return m_samples.First(); else return 0; }
}
///
--
cgit v1.1
From 84407e322f6469a3001b390f7c516f4eabaad1e6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 10 Jan 2013 01:30:00 +0000
Subject: revert accidental change to MemoryWatchdog stat calculation in
previous b1b4687
---
OpenSim/Framework/Monitoring/MemoryWatchdog.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Framework/Monitoring/MemoryWatchdog.cs')
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
index bc5ed97..c6010cd 100644
--- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -72,7 +72,7 @@ namespace OpenSim.Framework.Monitoring
///
public static double LastMemoryChurn
{
- get { if (m_samples.Count > 0) return m_samples.First(); else return 0; }
+ get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; }
}
///
--
cgit v1.1
From 5b1a9f84fdf4f9938180b403dd002b44e25c6efb Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 20 Jun 2013 00:32:12 +0100
Subject: minor: Change "memory churn" terminology in statistics to "heap
allocation rate" since this is more generally meaningful
---
OpenSim/Framework/Monitoring/MemoryWatchdog.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Framework/Monitoring/MemoryWatchdog.cs')
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
index c6010cd..c474622 100644
--- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -60,17 +60,17 @@ namespace OpenSim.Framework.Monitoring
private static bool m_enabled;
///
- /// Last memory churn in bytes per millisecond.
+ /// Average heap allocation rate in bytes per millisecond.
///
- public static double AverageMemoryChurn
+ public static double AverageHeapAllocationRate
{
get { if (m_samples.Count > 0) return m_samples.Average(); else return 0; }
}
///
- /// Average memory churn in bytes per millisecond.
+ /// Last heap allocation in bytes
///
- public static double LastMemoryChurn
+ public static double LastHeapAllocationRate
{
get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; }
}
--
cgit v1.1