From 421b562a045c69c5d507ee33e0283613d133e376 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 16 Mar 2012 02:43:33 +0000
Subject: Add process working memory to "show stats" memory statistics.
This shows the actual amount of RAM being taken up by OpenSimulator (objects + vm overhead)
---
OpenSim/Framework/Statistics/BaseStatsCollector.cs | 8 ++++++--
OpenSim/Framework/Util.cs | 7 +++++--
2 files changed, 11 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Statistics/BaseStatsCollector.cs b/OpenSim/Framework/Statistics/BaseStatsCollector.cs
index a1841c5..c9e57ce 100644
--- a/OpenSim/Framework/Statistics/BaseStatsCollector.cs
+++ b/OpenSim/Framework/Statistics/BaseStatsCollector.cs
@@ -26,8 +26,8 @@
*/
using System;
+using System.Diagnostics;
using System.Text;
-
using OpenMetaverse;
using OpenMetaverse.StructuredData;
@@ -46,8 +46,12 @@ namespace OpenSim.Framework.Statistics
sb.Append(Environment.NewLine);
sb.Append(
string.Format(
- "Allocated to OpenSim : {0} MB" + Environment.NewLine,
+ "Allocated to OpenSim objects: {0} MB\n",
Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0)));
+ sb.Append(
+ string.Format(
+ "Process memory : {0} MB\n",
+ Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0)));
return sb.ToString();
}
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index efa4a7b..31fa101 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -81,12 +81,15 @@ namespace OpenSim.Framework
private static uint nextXferID = 5000;
private static Random randomClass = new Random();
+
// Get a list of invalid file characters (OS dependent)
private static string regexInvalidFileChars = "[" + new String(Path.GetInvalidFileNameChars()) + "]";
private static string regexInvalidPathChars = "[" + new String(Path.GetInvalidPathChars()) + "]";
private static object XferLock = new object();
- /// Thread pool used for Util.FireAndForget if
- /// FireAndForgetMethod.SmartThreadPool is used
+
+ ///
+ /// Thread pool used for Util.FireAndForget if FireAndForgetMethod.SmartThreadPool is used
+ ///
private static SmartThreadPool m_ThreadPool;
// Unix-epoch starts at January 1st 1970, 00:00:00 UTC. And all our times in the server are (or at least should be) in UTC.
--
cgit v1.1
From 6e8f80f1ab933bbd00b892fa6d01f93f62a1bbbd Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 16 Mar 2012 03:26:47 +0000
Subject: Improve threadpool reporting to "show threads" console command (also
gets printed out periodically)
---
OpenSim/Framework/Servers/BaseOpenSimServer.cs | 8 +---
OpenSim/Framework/Util.cs | 56 +++++++++++++++++++++++++-
2 files changed, 57 insertions(+), 7 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index d5c2515..5c74ac9 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -272,12 +272,8 @@ namespace OpenSim.Framework.Servers
sb.Append(Environment.NewLine);
}
- int workers = 0, ports = 0, maxWorkers = 0, maxPorts = 0;
- ThreadPool.GetAvailableThreads(out workers, out ports);
- ThreadPool.GetMaxThreads(out maxWorkers, out maxPorts);
-
- sb.Append(Environment.NewLine + "*** ThreadPool threads ***" + Environment.NewLine);
- sb.Append("workers: " + (maxWorkers - workers) + " (" + maxWorkers + "); ports: " + (maxPorts - ports) + " (" + maxPorts + ")" + Environment.NewLine);
+ sb.Append("\n*** Main threadpool (excluding script engine)***\n");
+ sb.Append(Util.GetThreadPoolReport());
return sb.ToString();
}
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index 31fa101..9e0f138 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -147,7 +147,6 @@ namespace OpenSim.Framework
return lerp(y, lerp(x, a, b), lerp(x, c, d));
}
-
public static Encoding UTF8 = Encoding.UTF8;
///
@@ -1674,6 +1673,61 @@ namespace OpenSim.Framework
}
}
+ ///
+ /// Get a thread pool report.
+ ///
+ ///
+ public static string GetThreadPoolReport()
+ {
+ string threadPoolUsed = null;
+ int maxThreads = 0;
+ int minThreads = 0;
+ int allocatedThreads = 0;
+ int inUseThreads = 0;
+ int waitingCallbacks = 0;
+ int completionPortThreads = 0;
+
+ StringBuilder sb = new StringBuilder();
+ if (FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool)
+ {
+ threadPoolUsed = "SmartThreadPool";
+ maxThreads = m_ThreadPool.MaxThreads;
+ minThreads = m_ThreadPool.MinThreads;
+ inUseThreads = m_ThreadPool.InUseThreads;
+ allocatedThreads = m_ThreadPool.ActiveThreads;
+ waitingCallbacks = m_ThreadPool.WaitingCallbacks;
+ }
+ else if (
+ FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem
+ || FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem)
+ {
+ threadPoolUsed = "BuiltInThreadPool";
+ ThreadPool.GetMaxThreads(out maxThreads, out completionPortThreads);
+ ThreadPool.GetMinThreads(out minThreads, out completionPortThreads);
+ int availableThreads;
+ ThreadPool.GetAvailableThreads(out availableThreads, out completionPortThreads);
+ inUseThreads = maxThreads - availableThreads;
+ allocatedThreads = -1;
+ waitingCallbacks = -1;
+ }
+
+ if (threadPoolUsed != null)
+ {
+ sb.AppendFormat("Thread pool used : {0}\n", threadPoolUsed);
+ sb.AppendFormat("Max threads : {0}\n", maxThreads);
+ sb.AppendFormat("Min threads : {0}\n", minThreads);
+ sb.AppendFormat("Allocated threads : {0}\n", allocatedThreads < 0 ? "not applicable" : allocatedThreads.ToString());
+ sb.AppendFormat("In use threads : {0}\n", inUseThreads);
+ sb.AppendFormat("Work items waiting : {0}\n", waitingCallbacks < 0 ? "not available" : waitingCallbacks.ToString());
+ }
+ else
+ {
+ sb.AppendFormat("Thread pool not used\n");
+ }
+
+ return sb.ToString();
+ }
+
private static object SmartThreadPoolCallback(object o)
{
object[] array = (object[])o;
--
cgit v1.1
From bece2023e754d3d2c09753ad853f68c84243505c Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 16 Mar 2012 03:52:13 +0000
Subject: Add total scripts count to "show threads"
However, this returns 0 on Mono (at least on 2.6.7)! So not showing if it is zero.
---
OpenSim/Framework/Servers/BaseOpenSimServer.cs | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 5c74ac9..6da1436 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -269,10 +269,18 @@ namespace OpenSim.Framework.Servers
t.Priority,
t.ThreadState);
- sb.Append(Environment.NewLine);
+ sb.Append("\n");
}
- sb.Append("\n*** Main threadpool (excluding script engine)***\n");
+ sb.Append("\n");
+
+ // For some reason mono 2.6.7 returns an empty threads set! Not going to confuse people by reporting
+ // zero active threads.
+ int totalThreads = Process.GetCurrentProcess().Threads.Count;
+ if (totalThreads > 0)
+ sb.AppendFormat("Total threads active: {0}\n\n", Process.GetCurrentProcess().Threads.Count);
+
+ sb.Append("Main threadpool (excluding script engine pools)\n");
sb.Append(Util.GetThreadPoolReport());
return sb.ToString();
--
cgit v1.1
From 59b6f6a6e03417360d9ea94b8e9cabc8569ffe89 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 16 Mar 2012 03:56:56 +0000
Subject: minor: reuse threadpool count we just fetched instead of fetching it
again
---
OpenSim/Framework/Servers/BaseOpenSimServer.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 6da1436..06a8021 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -278,7 +278,7 @@ namespace OpenSim.Framework.Servers
// zero active threads.
int totalThreads = Process.GetCurrentProcess().Threads.Count;
if (totalThreads > 0)
- sb.AppendFormat("Total threads active: {0}\n\n", Process.GetCurrentProcess().Threads.Count);
+ sb.AppendFormat("Total threads active: {0}\n\n", totalThreads);
sb.Append("Main threadpool (excluding script engine pools)\n");
sb.Append(Util.GetThreadPoolReport());
--
cgit v1.1