diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 100 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs | 30 |
3 files changed, 130 insertions, 2 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 5ff9aee..72257d2 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Diagnostics; | ||
30 | using System.IO; | 31 | using System.IO; |
31 | using System.Net; | 32 | using System.Net; |
32 | using System.Net.Sockets; | 33 | using System.Net.Sockets; |
@@ -1053,6 +1054,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1053 | 1054 | ||
1054 | #endregion Update Timers | 1055 | #endregion Update Timers |
1055 | 1056 | ||
1057 | if (m_scene.EmergencyMonitoring) | ||
1058 | clientPacketHandler = MonitoredClientOutgoingPacketHandler; | ||
1059 | |||
1056 | // Handle outgoing packets, resends, acknowledgements, and pings for each | 1060 | // Handle outgoing packets, resends, acknowledgements, and pings for each |
1057 | // client. m_packetSent will be set to true if a packet is sent | 1061 | // client. m_packetSent will be set to true if a packet is sent |
1058 | m_scene.ForEachClient(clientPacketHandler); | 1062 | m_scene.ForEachClient(clientPacketHandler); |
@@ -1068,6 +1072,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1068 | { | 1072 | { |
1069 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex); | 1073 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex); |
1070 | } | 1074 | } |
1075 | |||
1071 | } | 1076 | } |
1072 | 1077 | ||
1073 | Watchdog.RemoveThread(); | 1078 | Watchdog.RemoveThread(); |
@@ -1105,6 +1110,101 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1105 | } | 1110 | } |
1106 | } | 1111 | } |
1107 | 1112 | ||
1113 | #region Emergency Monitoring | ||
1114 | private Stopwatch watch1 = new Stopwatch(); | ||
1115 | private Stopwatch watch2 = new Stopwatch(); | ||
1116 | |||
1117 | private float avgProcessingTicks = 0; | ||
1118 | private float avgResendUnackedTicks = 0; | ||
1119 | private float avgSendAcksTicks = 0; | ||
1120 | private float avgSendPingTicks = 0; | ||
1121 | private float avgDequeueTicks = 0; | ||
1122 | private long nticks = 0; | ||
1123 | private long nticksUnack = 0; | ||
1124 | private long nticksAck = 0; | ||
1125 | private long nticksPing = 0; | ||
1126 | |||
1127 | private void MonitoredClientOutgoingPacketHandler(IClientAPI client) | ||
1128 | { | ||
1129 | nticks++; | ||
1130 | watch1.Start(); | ||
1131 | try | ||
1132 | { | ||
1133 | if (client is LLClientView) | ||
1134 | { | ||
1135 | LLUDPClient udpClient = ((LLClientView)client).UDPClient; | ||
1136 | |||
1137 | if (udpClient.IsConnected) | ||
1138 | { | ||
1139 | if (m_resendUnacked) | ||
1140 | { | ||
1141 | nticksUnack++; | ||
1142 | watch2.Start(); | ||
1143 | |||
1144 | ResendUnacked(udpClient); | ||
1145 | |||
1146 | watch2.Stop(); | ||
1147 | avgResendUnackedTicks = (nticksUnack - 1)/(float)nticksUnack * avgResendUnackedTicks + (watch2.ElapsedTicks / (float)nticksUnack); | ||
1148 | watch2.Reset(); | ||
1149 | } | ||
1150 | |||
1151 | if (m_sendAcks) | ||
1152 | { | ||
1153 | nticksAck++; | ||
1154 | watch2.Start(); | ||
1155 | |||
1156 | SendAcks(udpClient); | ||
1157 | |||
1158 | watch2.Stop(); | ||
1159 | avgSendAcksTicks = (nticksAck - 1) / (float)nticksAck * avgSendAcksTicks + (watch2.ElapsedTicks / (float)nticksAck); | ||
1160 | watch2.Reset(); | ||
1161 | } | ||
1162 | |||
1163 | if (m_sendPing) | ||
1164 | { | ||
1165 | nticksPing++; | ||
1166 | watch2.Start(); | ||
1167 | |||
1168 | SendPing(udpClient); | ||
1169 | |||
1170 | watch2.Stop(); | ||
1171 | avgSendPingTicks = (nticksPing - 1) / (float)nticksPing * avgSendPingTicks + (watch2.ElapsedTicks / (float)nticksPing); | ||
1172 | watch2.Reset(); | ||
1173 | } | ||
1174 | |||
1175 | watch2.Start(); | ||
1176 | // Dequeue any outgoing packets that are within the throttle limits | ||
1177 | if (udpClient.DequeueOutgoing()) | ||
1178 | m_packetSent = true; | ||
1179 | watch2.Stop(); | ||
1180 | avgDequeueTicks = (nticks - 1) / (float)nticks * avgDequeueTicks + (watch2.ElapsedTicks / (float)nticks); | ||
1181 | watch2.Reset(); | ||
1182 | |||
1183 | } | ||
1184 | else | ||
1185 | m_log.WarnFormat("[LLUDPSERVER]: Client is not connected"); | ||
1186 | } | ||
1187 | } | ||
1188 | catch (Exception ex) | ||
1189 | { | ||
1190 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name + | ||
1191 | " threw an exception: " + ex.Message, ex); | ||
1192 | } | ||
1193 | watch1.Stop(); | ||
1194 | avgProcessingTicks = (nticks - 1) / (float)nticks * avgProcessingTicks + (watch1.ElapsedTicks / (float)nticks); | ||
1195 | watch1.Reset(); | ||
1196 | |||
1197 | // reuse this -- it's every 100ms | ||
1198 | if (m_scene.EmergencyMonitoring && nticks % 100 == 0) | ||
1199 | { | ||
1200 | m_log.InfoFormat("[LLUDPSERVER]: avg processing ticks: {0} avg unacked: {1} avg acks: {2} avg ping: {3} avg dequeue: {4} (pack sent? {5})", | ||
1201 | avgProcessingTicks, avgResendUnackedTicks, avgSendAcksTicks, avgSendPingTicks, avgDequeueTicks, m_packetSent); | ||
1202 | } | ||
1203 | |||
1204 | } | ||
1205 | |||
1206 | #endregion | ||
1207 | |||
1108 | private void ProcessInPacket(object state) | 1208 | private void ProcessInPacket(object state) |
1109 | { | 1209 | { |
1110 | IncomingPacket incomingPacket = (IncomingPacket)state; | 1210 | IncomingPacket incomingPacket = (IncomingPacket)state; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4fca261..355671c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -64,6 +64,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
64 | 64 | ||
65 | #region Fields | 65 | #region Fields |
66 | 66 | ||
67 | public bool EmergencyMonitoring = false; | ||
68 | |||
67 | public SynchronizeSceneHandler SynchronizeScene; | 69 | public SynchronizeSceneHandler SynchronizeScene; |
68 | public SimStatsReporter StatsReporter; | 70 | public SimStatsReporter StatsReporter; |
69 | public List<Border> NorthBorders = new List<Border>(); | 71 | public List<Border> NorthBorders = new List<Border>(); |
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index 6630edb..53cebb2 100644 --- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs | |||
@@ -95,7 +95,15 @@ namespace OpenSim.Region.CoreModules.UDP.Linden | |||
95 | "Show throttle settings for each client and for the server overall", | 95 | "Show throttle settings for each client and for the server overall", |
96 | "Without the 'full' option, only root agents are shown." | 96 | "Without the 'full' option, only root agents are shown." |
97 | + " With the 'full' option child agents are also shown.", | 97 | + " With the 'full' option child agents are also shown.", |
98 | ShowThrottlesReport); | 98 | ShowThrottlesReport); |
99 | |||
100 | scene.AddCommand( | ||
101 | this, "emergency-monitoring", | ||
102 | "Go on/off emergency monitoring mode", | ||
103 | "Go on/off emergency monitoring mode", | ||
104 | "Go on/off emergency monitoring mode", | ||
105 | EmergencyMonitoring); | ||
106 | |||
99 | } | 107 | } |
100 | 108 | ||
101 | public void RemoveRegion(Scene scene) | 109 | public void RemoveRegion(Scene scene) |
@@ -120,7 +128,25 @@ namespace OpenSim.Region.CoreModules.UDP.Linden | |||
120 | { | 128 | { |
121 | MainConsole.Instance.Output(GetThrottlesReport(cmd)); | 129 | MainConsole.Instance.Output(GetThrottlesReport(cmd)); |
122 | } | 130 | } |
123 | 131 | ||
132 | protected void EmergencyMonitoring(string module, string[] cmd) | ||
133 | { | ||
134 | bool mode = true; | ||
135 | if (cmd.Length == 1 || (cmd.Length > 1 && cmd[1] == "on")) | ||
136 | { | ||
137 | mode = true; | ||
138 | MainConsole.Instance.Output("Emergency Monitoring ON"); | ||
139 | } | ||
140 | else | ||
141 | { | ||
142 | mode = false; | ||
143 | MainConsole.Instance.Output("Emergency Monitoring OFF"); | ||
144 | } | ||
145 | |||
146 | foreach (Scene s in m_scenes.Values) | ||
147 | s.EmergencyMonitoring = mode; | ||
148 | } | ||
149 | |||
124 | protected string GetColumnEntry(string entry, int maxLength, int columnPadding) | 150 | protected string GetColumnEntry(string entry, int maxLength, int columnPadding) |
125 | { | 151 | { |
126 | return string.Format( | 152 | return string.Format( |