Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
						commit
						6b9a65972c
					
				|  | @ -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 | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Provides a means to continuously log stats for debugging purposes. | ||||
|     /// </summary> | ||||
|     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(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -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<string> GetAllStatsReports() | ||||
|         { | ||||
|             List<string> reports = new List<string>(); | ||||
| 
 | ||||
|             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<string> GetCategoryStatsReports( | ||||
|             SortedDictionary<string, SortedDictionary<string, Stat>> category) | ||||
|         { | ||||
|             List<string> reports = new List<string>(); | ||||
| 
 | ||||
|             foreach (var container in category.Values) | ||||
|                 reports.AddRange(GetContainerStatsReports(container)); | ||||
| 
 | ||||
|             return reports; | ||||
|         } | ||||
| 
 | ||||
|         private static void OutputCategoryStatsToConsole( | ||||
|             ICommandConsole con, SortedDictionary<string, SortedDictionary<string, Stat>> 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<string, Stat> container) | ||||
|         private static List<string> GetContainerStatsReports(SortedDictionary<string, Stat> container) | ||||
|         { | ||||
|             List<string> reports = new List<string>(); | ||||
| 
 | ||||
|             foreach (Stat stat in container.Values) | ||||
|             { | ||||
|                 con.Output(stat.ToConsoleString()); | ||||
|             } | ||||
|                 reports.Add(stat.ToConsoleString()); | ||||
| 
 | ||||
|             return reports; | ||||
|         } | ||||
| 
 | ||||
|         private static void OutputContainerStatsToConsole( | ||||
|             ICommandConsole con, SortedDictionary<string, Stat> container) | ||||
|         { | ||||
|             foreach (string report in GetContainerStatsReports(container)) | ||||
|                 con.Output(report); | ||||
|         } | ||||
| 
 | ||||
|         // Creates an OSDMap of the format: | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -11,22 +11,56 @@ | |||
|   </appSettings> | ||||
|   <log4net> | ||||
|     <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> | ||||
|         <conversionPattern value="%date{HH:mm:ss} - %message" /> | ||||
|         <!-- console log with milliseconds.  Useful for debugging --> | ||||
| <!--        <conversionPattern value="%date{HH:mm:ss.fff} - %message" /> --> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="OpenSim.32BitLaunch.log" /> | ||||
|       <appendToFile value="true" /> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date %-5level - %logger %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="OpenSimStats.log"/> | ||||
|       <appendToFile value="true" /> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date - %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <root> | ||||
|       <level value="DEBUG" /> | ||||
|       <appender-ref ref="Console" /> | ||||
|       <appender-ref ref="LogFileAppender" /> | ||||
|     </root> | ||||
| 
 | ||||
|     <!-- Independently control logging level for XEngine --> | ||||
|     <logger name="OpenSim.Region.ScriptEngine.XEngine"> | ||||
|       <level value="INFO"/> | ||||
|     </logger> | ||||
| 
 | ||||
|     <!-- Independently control logging level for per region module loading --> | ||||
|     <logger name="OpenSim.ApplicationPlugins.RegionModulesController.RegionModulesControllerPlugin"> | ||||
|       <level value="INFO"/> | ||||
|     </logger> | ||||
| 
 | ||||
|     <!-- used for stats recording --> | ||||
|     <logger name="special.StatsLogger"> | ||||
|       <appender-ref ref="StatsLogFileAppender"/> | ||||
|     </logger> | ||||
|   </log4net> | ||||
| </configuration> | ||||
|  |  | |||
|  | @ -11,6 +11,10 @@ | |||
|   </appSettings> | ||||
|   <log4net> | ||||
|     <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date{HH:mm:ss} - %message" /> | ||||
|         <!-- console log with milliseconds.  Useful for debugging --> | ||||
|  | @ -21,11 +25,23 @@ | |||
|     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="OpenSim.log" /> | ||||
|       <appendToFile value="true" /> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date %-5level - %logger %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="OpenSimStats.log"/> | ||||
|       <appendToFile value="true" /> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date - %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <root> | ||||
|       <level value="DEBUG" /> | ||||
|       <appender-ref ref="Console" /> | ||||
|  | @ -42,5 +58,10 @@ | |||
|       <level value="INFO"/> | ||||
|     </logger> | ||||
| 
 | ||||
|     <!-- used for stats recording --> | ||||
|     <logger name="special.StatsLogger"> | ||||
|       <appender-ref ref="StatsLogFileAppender"/> | ||||
|     </logger> | ||||
| 
 | ||||
|   </log4net> | ||||
| </configuration> | ||||
|  |  | |||
|  | @ -11,22 +11,44 @@ | |||
|   </appSettings> | ||||
|   <log4net> | ||||
|     <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="Robust.32BitLaunch.log" /> | ||||
|       <appendToFile value="true" /> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date %-5level - %logger %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="RobustStats.log"/> | ||||
|       <appendToFile value="true" /> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date - %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <root> | ||||
|       <level value="DEBUG" /> | ||||
|       <appender-ref ref="Console" /> | ||||
|       <appender-ref ref="LogFileAppender" /> | ||||
|     </root> | ||||
| 
 | ||||
|     <!-- used for stats recording --> | ||||
|     <logger name="special.StatsLogger"> | ||||
|       <appender-ref ref="StatsLogFileAppender"/> | ||||
|     </logger> | ||||
|   </log4net> | ||||
| </configuration> | ||||
|  |  | |||
|  | @ -11,6 +11,10 @@ | |||
|   </appSettings> | ||||
|   <log4net> | ||||
|     <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> | ||||
|       </layout> | ||||
|  | @ -19,15 +23,32 @@ | |||
|     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="Robust.log" /> | ||||
|       <appendToFile value="true" /> | ||||
|       <filter type="log4net.Filter.LoggerMatchFilter"> | ||||
|         <loggerToMatch value="special"/> | ||||
|         <acceptOnMatch value="false"/> | ||||
|       </filter> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date %-5level - %logger %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender"> | ||||
|       <file value="RobustStats.log"/> | ||||
|       <appendToFile value="true" /> | ||||
|       <layout type="log4net.Layout.PatternLayout"> | ||||
|         <conversionPattern value="%date - %message%newline" /> | ||||
|       </layout> | ||||
|     </appender> | ||||
| 
 | ||||
|     <root> | ||||
|       <level value="DEBUG" /> | ||||
|       <appender-ref ref="Console" /> | ||||
|       <appender-ref ref="LogFileAppender" /> | ||||
|     </root> | ||||
| 
 | ||||
|     <!-- used for stats recording --> | ||||
|     <logger name="special.StatsLogger"> | ||||
|       <appender-ref ref="StatsLogFileAppender"/> | ||||
|     </logger> | ||||
|   </log4net> | ||||
| </configuration> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Diva Canto
						Diva Canto