diff --git a/OpenSim/Framework/Monitoring/StatsLogger.cs b/OpenSim/Framework/Monitoring/StatsLogger.cs
new file mode 100644
index 0000000000..fa2e1b641e
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/StatsLogger.cs
@@ -0,0 +1,108 @@
+/*
+ * 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.Reflection;
+using System.Timers;
+using log4net;
+
+namespace OpenSim.Framework.Monitoring
+{
+ ///
+ /// Provides a means to continuously log stats for debugging purposes.
+ ///
+ public static class StatsLogger
+ {
+ private static readonly ILog m_statsLog = LogManager.GetLogger("special.StatsLogger");
+
+ private static Timer m_loggingTimer;
+ private static int m_statsLogIntervalMs = 5000;
+
+ public static void RegisterConsoleCommands(ICommandConsole console)
+ {
+ console.Commands.AddCommand(
+ "Debug",
+ false,
+ "debug stats record",
+ "debug stats record start|stop",
+ "Control whether stats are being regularly recorded to a separate file.",
+ "For debug purposes. Experimental.",
+ HandleStatsRecordCommand);
+ }
+
+ public static void HandleStatsRecordCommand(string module, string[] cmd)
+ {
+ ICommandConsole con = MainConsole.Instance;
+
+ if (cmd.Length != 4)
+ {
+ con.Output("Usage: debug stats record start|stop");
+ return;
+ }
+
+ if (cmd[3] == "start")
+ {
+ Start();
+ con.OutputFormat("Now recording all stats very {0}ms to file", m_statsLogIntervalMs);
+ }
+ else if (cmd[3] == "stop")
+ {
+ Stop();
+ con.Output("Stopped recording stats to file.");
+ }
+ }
+
+ public static void Start()
+ {
+ if (m_loggingTimer != null)
+ Stop();
+
+ m_loggingTimer = new Timer(m_statsLogIntervalMs);
+ m_loggingTimer.AutoReset = false;
+ m_loggingTimer.Elapsed += Log;
+ m_loggingTimer.Start();
+ }
+
+ public static void Stop()
+ {
+ if (m_loggingTimer != null)
+ {
+ m_loggingTimer.Stop();
+ }
+ }
+
+ private static void Log(object sender, ElapsedEventArgs e)
+ {
+ m_statsLog.InfoFormat("*** STATS REPORT AT {0} ***", DateTime.Now);
+
+ foreach (string report in StatsManager.GetAllStatsReports())
+ m_statsLog.Info(report);
+
+ m_loggingTimer.Start();
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs
index 87197f422f..c8e838cadf 100644
--- a/OpenSim/Framework/Monitoring/StatsManager.cs
+++ b/OpenSim/Framework/Monitoring/StatsManager.cs
@@ -81,6 +81,8 @@ namespace OpenSim.Framework.Monitoring
+ "More than one name can be given separated by spaces.\n"
+ "THIS STATS FACILITY IS EXPERIMENTAL AND DOES NOT YET CONTAIN ALL STATS",
HandleShowStatsCommand);
+
+ StatsLogger.RegisterConsoleCommands(console);
}
public static void HandleShowStatsCommand(string module, string[] cmd)
@@ -145,29 +147,55 @@ namespace OpenSim.Framework.Monitoring
}
}
+ public static List GetAllStatsReports()
+ {
+ List reports = new List();
+
+ foreach (var category in RegisteredStats.Values)
+ reports.AddRange(GetCategoryStatsReports(category));
+
+ return reports;
+ }
+
private static void OutputAllStatsToConsole(ICommandConsole con)
{
- foreach (var category in RegisteredStats.Values)
- {
- OutputCategoryStatsToConsole(con, category);
- }
+ foreach (string report in GetAllStatsReports())
+ con.Output(report);
+ }
+
+ private static List GetCategoryStatsReports(
+ SortedDictionary> category)
+ {
+ List reports = new List();
+
+ foreach (var container in category.Values)
+ reports.AddRange(GetContainerStatsReports(container));
+
+ return reports;
}
private static void OutputCategoryStatsToConsole(
ICommandConsole con, SortedDictionary> category)
{
- foreach (var container in category.Values)
- {
- OutputContainerStatsToConsole(con, container);
- }
+ foreach (string report in GetCategoryStatsReports(category))
+ con.Output(report);
}
- private static void OutputContainerStatsToConsole( ICommandConsole con, SortedDictionary container)
+ private static List GetContainerStatsReports(SortedDictionary container)
{
+ List reports = new List();
+
foreach (Stat stat in container.Values)
- {
- con.Output(stat.ToConsoleString());
- }
+ reports.Add(stat.ToConsoleString());
+
+ return reports;
+ }
+
+ private static void OutputContainerStatsToConsole(
+ ICommandConsole con, SortedDictionary container)
+ {
+ foreach (string report in GetContainerStatsReports(container))
+ con.Output(report);
}
// Creates an OSDMap of the format:
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 1bee6a3438..c258ff6403 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -274,6 +274,12 @@ namespace OpenSim.Framework.Servers
"Set threadpool parameters. For debug purposes.",
HandleDebugThreadpoolSet);
+ m_console.Commands.AddCommand (
+ "Debug", false, "debug threadpool status",
+ "debug threadpool status",
+ "Show current debug threadpool parameters.",
+ HandleDebugThreadpoolStatus);
+
m_console.Commands.AddCommand(
"Debug", false, "force gc",
"force gc",
@@ -337,6 +343,23 @@ namespace OpenSim.Framework.Servers
Notice("serialosdreq is now {0}", setSerializeOsdRequests);
}
+ private void HandleDebugThreadpoolStatus(string module, string[] args)
+ {
+ int workerThreads, iocpThreads;
+
+ ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
+ Notice("Min worker threads: {0}", workerThreads);
+ Notice("Min IOCP threads: {0}", iocpThreads);
+
+ ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
+ Notice("Max worker threads: {0}", workerThreads);
+ Notice("Max IOCP threads: {0}", iocpThreads);
+
+ ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);
+ Notice("Available worker threads: {0}", workerThreads);
+ Notice("Available IOCP threads: {0}", iocpThreads);
+ }
+
private void HandleDebugThreadpoolSet(string module, string[] args)
{
if (args.Length != 6)
diff --git a/bin/OpenSim.32BitLaunch.exe.config b/bin/OpenSim.32BitLaunch.exe.config
index 6ac0206e6c..6a6b3c8768 100644
--- a/bin/OpenSim.32BitLaunch.exe.config
+++ b/bin/OpenSim.32BitLaunch.exe.config
@@ -11,22 +11,56 @@
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bin/OpenSim.exe.config b/bin/OpenSim.exe.config
index 8a891f4917..b2cb4e5b81 100755
--- a/bin/OpenSim.exe.config
+++ b/bin/OpenSim.exe.config
@@ -11,6 +11,10 @@
+
+
+
+
@@ -21,11 +25,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -42,5 +58,10 @@
+
+
+
+
+
diff --git a/bin/Robust.32BitLaunch.exe.config b/bin/Robust.32BitLaunch.exe.config
index dae45ffaaa..ec17049a84 100644
--- a/bin/Robust.32BitLaunch.exe.config
+++ b/bin/Robust.32BitLaunch.exe.config
@@ -11,22 +11,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bin/Robust.exe.config b/bin/Robust.exe.config
index 4914f55cb2..62975fd6a1 100644
--- a/bin/Robust.exe.config
+++ b/bin/Robust.exe.config
@@ -11,6 +11,10 @@
+
+
+
+
@@ -19,15 +23,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+