From cc2a679121df7255f2a0a31771ab1f254d7a788d Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Thu, 10 Mar 2011 14:04:10 -0800 Subject: [PATCH] Sync statistics to a file --- .../PhysEngineToSceneConnector.cs | 33 +++++++++++---- .../SceneToPhysEngineConnector.cs | 42 +++++++++---------- .../SceneToPhysEngineSyncServer.cs | 2 +- .../SymmetricSync/RegionSyncModule.cs | 13 +++++- .../SymmetricSync/SyncConnector.cs | 25 +++++++---- 5 files changed, 76 insertions(+), 39 deletions(-) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs index 543d17a055..6153bdca1f 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs @@ -64,10 +64,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // The client connection to the RegionSyncServer private TcpClient m_client = new TcpClient(); - - //KittyL: Comment out m_statsTimer for now, will figure out whether we need it for PhysEngine later - //private System.Timers.Timer m_statsTimer = new System.Timers.Timer(30000); - // The queue of incoming messages which need handling //private Queue m_inQ = new Queue(); @@ -105,11 +101,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_addrString = addr; m_port = port; m_debugWithViewer = debugWithViewer; - //m_statsTimer.Elapsed += new System.Timers.ElapsedEventHandler(StatsTimerElapsed); m_sysConfig = sysConfig; - SceneToPhysEngineSyncServer.logEnabled = m_sysConfig.GetBoolean("LogEnabled", false); - SceneToPhysEngineSyncServer.logDir = m_sysConfig.GetString("LogDir", "."); + SceneToPhysEngineSyncServer.logEnabled = m_sysConfig.GetBoolean("PhysLogEnabled", false); + SceneToPhysEngineSyncServer.logDir = m_sysConfig.GetString("PhysLogDir", "."); //assume we are connecting to the whole scene as one big quark m_subscribedQuarks = new QuarkSubsriptionInfo(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize); @@ -534,5 +529,29 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule #endregion Handlers for events/updates from Scene + public string StatisticIdentifier() + { + return "PhysEngineToSceneConnector"; + } + + public string StatisticLine(bool clearFlag) + { + string ret = ""; + /* + lock (stats) + { + ret = String.Format("{0},{1},{2},{3},{4},{5}", + msgsIn, msgsOut, bytesIn, bytesOut + ); + if (clearFlag) + msgsIn = msgsOut = bytesIn = bytesOut = 0; + } + */ + return ret; + } + public string StatisticTitle() + { + return "msgsIn,msgsOut,bytesIn,bytesOut"; + } } } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs index c2e0c0cf8f..399b35a11d 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs @@ -27,7 +27,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // The SceneToPhysEngineConnector acts as a thread on the RegionSyncServer to handle incoming // messages from PhysEngineToSceneConnectors that run on Physics Engines. It connects the // authoratative Scene with remote script engines. - public class SceneToPhysEngineConnector + public class SceneToPhysEngineConnector : ISyncStatistics { #region SceneToPhysEngineConnector members @@ -38,9 +38,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private long bytesIn; private long bytesOut; private long pollBlocks; - private int lastTotalCount; - private int lastLocalCount; - private int lastRemoteCount; private int msgCount = 0; @@ -49,7 +46,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // Set the addr and port for TcpListener private IPAddress m_addr; private Int32 m_port; - private int m_connection_number; + private static int m_connection_number = 0; private Scene m_scene; object m_syncRoot = new object(); @@ -93,32 +90,33 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule get { return m_connection_number; } } - public string GetStats() + public string StatisticIdentifier() { - string ret; - //lock (m_syncRoot) - // syncedAvCount = m_syncedAvatars.Count; + return "SceneToPhysEngineConnector" + ConnectionNum.ToString(); + } + + public string StatisticLine(bool clearFlag) + { + string ret = ""; lock (stats) { double secondsSinceLastStats = DateTime.Now.Subtract(lastStatTime).TotalSeconds; lastStatTime = DateTime.Now; - // ret = String.Format("[{0,4}/{1,4}], [{2,4}/{3,4}], [{4,4}/{5,4}], [{6,4} ({7,4})], [{8,8} ({9,8:00.00})], [{10,4} ({11,4})], [{12,8} ({13,8:00.00})], [{14,8} ({15,4}]", - ret = String.Format("[{0,4}/{1,4}], [{2,6}/{3,6}], [{4,4}/{5,4}], [{6,6} ({7,6})], [{8,4} ({9,4})]", - //lastTotalCount, totalAvCount, // TOTAL AVATARS - //lastLocalCount, syncedAvCount, // LOCAL TO THIS CLIENT VIEW - //lastRemoteCount, totalAvCount - syncedAvCount, // REMOTE (SHOULD = TOTAL - LOCAL) - msgsIn, (int)(msgsIn / secondsSinceLastStats), - bytesIn, 8 * (bytesIn / secondsSinceLastStats / 1000000), // IN - msgsOut, (int)(msgsOut / secondsSinceLastStats), - bytesOut, 8 * (bytesOut / secondsSinceLastStats / 1000000), // OUT - pollBlocks, (int)(pollBlocks / secondsSinceLastStats)); // NUMBER OF TIMES WE BLOCKED WRITING TO SOCKET - - msgsIn = msgsOut = bytesIn = bytesOut = pollBlocks = 0; + ret = String.Format("{0},{1},{2},{3},{4}", + msgsIn, msgsOut, bytesIn, bytesOut, pollBlocks + ); + if (clearFlag) + msgsIn = msgsOut = bytesIn = bytesOut = pollBlocks = 0; } return ret; } + public string StatisticTitle() + { + return "msgsIn,msgsOut,bytesIn,bytesOut,pollBlocks"; + } + // Check if the client is connected public bool Connected { get { return m_tcpclient.Connected; } } @@ -163,6 +161,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //m_log.WarnFormat("{0} Started thread: {1}", LogHeader, m_receive_loop.Name); m_receive_loop.Start(); + SyncStatisticCollector.Register(this); + //tell the remote script engine about the locX, locY of this authoritative scene // SendSceneLoc(); m_log.DebugFormat("{0}: SceneToPhysEngineConnector initialized", LogHeader); diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs index a4cbb96c81..32262c0232 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs @@ -174,7 +174,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_log.Warn(LogHeader + " Synchronized"); foreach (SceneToPhysEngineConnector pec in m_physEngineConnectors) { - m_log.Warn(pec.GetStats()); + m_log.Warn(pec.StatisticLine(true)); } } } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index acac3c404b..c84c22452b 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -73,6 +73,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_log.Warn("[REGION SYNC MODULE] Initialised for actor "+ m_actorID); //The ActorType configuration will be read in and process by an ActorSyncModule, not here. + + // parameters for statistic logging + SyncStatisticCollector.LogEnabled = m_sysConfig.GetBoolean("SyncLogEnabled", false); + SyncStatisticCollector.LogDirectory = m_sysConfig.GetString("SyncLogDirectory", "."); + SyncStatisticCollector.LogInterval = m_sysConfig.GetInt("SyncLogInterval", 5000); + SyncStatisticCollector.LogMaxFileTimeMin = m_sysConfig.GetInt("SyncLogMaxFileTimeMin", 5); + SyncStatisticCollector.LogFileHeader = m_sysConfig.GetString("SyncLogFileHeader", "stats-"); } //Called after Initialise() @@ -1163,10 +1170,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private void SyncStatus(Object[] args) { - m_log.WarnFormat("[REGION SYNC MODULE]: Description: {0}", SyncConnector.StatusTitle()); + int connectorCount = 0; ForEachSyncConnector(delegate(SyncConnector connector) { - m_log.WarnFormat("{0}: {1}: {2}", "[REGION SYNC MODULE}", connector.Description, connector.StatusLine()); + if (connectorCount++ == 0) + m_log.WarnFormat("[REGION SYNC MODULE]: Description: {0}", connector.StatisticTitle()); + m_log.WarnFormat("{0}: {1}: {2}", "[REGION SYNC MODULE}", connector.Description, connector.StatisticLine(true)); }); } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs index 817a250d4a..2ae9608991 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs @@ -14,7 +14,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { // For implementations, a lot was copied from RegionSyncClientView, especially the SendLoop/ReceiveLoop. - public class SyncConnector + public class SyncConnector : ISyncStatistics { private TcpClient m_tcpConnection = null; private RegionSyncListenerInfo m_remoteListenerInfo = null; @@ -39,7 +39,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private RegionSyncModule m_regionSyncModule = null; - private int m_connectorNum; + // unique connector number across all regions + private static int m_connectorNum = 0; public int ConnectorNum { get { return m_connectorNum; } @@ -69,8 +70,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule get { if (m_syncOtherSideRegionName == null) - return String.Format("SyncConnector#{0}", m_connectorNum); - return String.Format("SyncConnector#{0}(A={2},R={1:10})", + return String.Format("SyncConnector{0}", m_connectorNum); + return String.Format("SyncConnector{0}({2}/{1:10})", m_connectorNum, m_syncOtherSideRegionName, m_syncOtherSideActorID); } } @@ -86,6 +87,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_connectorNum = connectorNum; m_regionSyncModule = syncModule; lastStatTime = DateTime.Now; + SyncStatisticCollector.Register(this); m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); } @@ -100,6 +102,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_connectorNum = connectorNum; m_regionSyncModule = syncModule; lastStatTime = DateTime.Now; + SyncStatisticCollector.Register(this); m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); } @@ -299,7 +302,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_regionSyncModule.HandleIncomingMessage(msg, m_syncOtherSideActorID); } - public string StatusLine() + public string StatisticIdentifier() + { + return this.Description; + } + + public string StatisticLine(bool clearFlag) { string statLine = ""; lock (stats) @@ -310,14 +318,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule msgsIn, msgsOut, bytesIn, bytesOut, m_outQ.Count, 8 * (bytesIn / secondsSinceLastStats / 1000000), 8 * (bytesOut / secondsSinceLastStats / 1000000) ); - msgsIn = msgsOut = bytesIn = bytesOut = 0; + if (clearFlag) + msgsIn = msgsOut = bytesIn = bytesOut = 0; } return statLine; } - public static string StatusTitle() + public string StatisticTitle() { - return "msgsIn,msgsOut,queueSize,Mbps In,Mbps Out"; + return "msgsIn,msgsOut,bytesIn,bytesOut,queueSize,Mbps In,Mbps Out"; } } } \ No newline at end of file