diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SimStatsReporter.cs | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 87af311..11c321b 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs | |||
@@ -117,12 +117,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
117 | private Dictionary<string, float> m_lastReportedExtraSimStats = new Dictionary<string, float>(); | 117 | private Dictionary<string, float> m_lastReportedExtraSimStats = new Dictionary<string, float>(); |
118 | 118 | ||
119 | // Sending a stats update every 3 seconds- | 119 | // Sending a stats update every 3 seconds- |
120 | private int statsUpdatesEveryMS = 3000; | 120 | private int m_statsUpdatesEveryMS = 3000; |
121 | private float statsUpdateFactor = 0; | 121 | private float m_statsUpdateFactor = 0; |
122 | private float m_timeDilation = 0; | 122 | private float m_timeDilation = 0; |
123 | private int m_fps = 0; | 123 | private int m_fps = 0; |
124 | 124 | ||
125 | /// <summary> | 125 | /// <summary> |
126 | /// Number of the last frame on which we processed a stats udpate. | ||
127 | /// </summary> | ||
128 | private uint m_lastUpdateFrame; | ||
129 | |||
130 | /// <summary> | ||
126 | /// Our nominal fps target, as expected in fps stats when a sim is running normally. | 131 | /// Our nominal fps target, as expected in fps stats when a sim is running normally. |
127 | /// </summary> | 132 | /// </summary> |
128 | private float m_nominalReportedFps = 55; | 133 | private float m_nominalReportedFps = 55; |
@@ -188,12 +193,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
188 | { | 193 | { |
189 | m_scene = scene; | 194 | m_scene = scene; |
190 | m_reportedFpsCorrectionFactor = scene.MinFrameTime * m_nominalReportedFps; | 195 | m_reportedFpsCorrectionFactor = scene.MinFrameTime * m_nominalReportedFps; |
191 | statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); | 196 | m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); |
192 | ReportingRegion = scene.RegionInfo; | 197 | ReportingRegion = scene.RegionInfo; |
193 | 198 | ||
194 | m_objectCapacity = scene.RegionInfo.ObjectCapacity; | 199 | m_objectCapacity = scene.RegionInfo.ObjectCapacity; |
195 | m_report.AutoReset = true; | 200 | m_report.AutoReset = true; |
196 | m_report.Interval = statsUpdatesEveryMS; | 201 | m_report.Interval = m_statsUpdatesEveryMS; |
197 | m_report.Elapsed += statsHeartBeat; | 202 | m_report.Elapsed += statsHeartBeat; |
198 | m_report.Enabled = true; | 203 | m_report.Enabled = true; |
199 | 204 | ||
@@ -213,9 +218,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
213 | /// <param name='ms'></param> | 218 | /// <param name='ms'></param> |
214 | public void SetUpdateMS(int ms) | 219 | public void SetUpdateMS(int ms) |
215 | { | 220 | { |
216 | statsUpdatesEveryMS = ms; | 221 | m_statsUpdatesEveryMS = ms; |
217 | statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); | 222 | m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); |
218 | m_report.Interval = statsUpdatesEveryMS; | 223 | m_report.Interval = m_statsUpdatesEveryMS; |
219 | } | 224 | } |
220 | 225 | ||
221 | private void statsHeartBeat(object sender, EventArgs e) | 226 | private void statsHeartBeat(object sender, EventArgs e) |
@@ -247,7 +252,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
247 | int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); | 252 | int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); |
248 | 253 | ||
249 | // save the reported value so there is something available for llGetRegionFPS | 254 | // save the reported value so there is something available for llGetRegionFPS |
250 | lastReportedSimFPS = reportedFPS / statsUpdateFactor; | 255 | lastReportedSimFPS = reportedFPS / m_statsUpdateFactor; |
251 | 256 | ||
252 | float physfps = ((m_pfps / 1000)); | 257 | float physfps = ((m_pfps / 1000)); |
253 | 258 | ||
@@ -279,6 +284,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
279 | // 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change | 284 | // 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change |
280 | // values to X-per-second values. | 285 | // values to X-per-second values. |
281 | 286 | ||
287 | uint thisFrame = m_scene.Frame; | ||
288 | float framesUpdated = (float)(thisFrame - m_lastUpdateFrame); | ||
289 | m_lastUpdateFrame = thisFrame; | ||
290 | |||
291 | // Avoid div-by-zero if somehow we've not updated any frames. | ||
292 | if (framesUpdated == 0) | ||
293 | framesUpdated = 1; | ||
294 | |||
282 | for (int i = 0; i < 21; i++) | 295 | for (int i = 0; i < 21; i++) |
283 | { | 296 | { |
284 | sb[i] = new SimStatsPacket.StatBlock(); | 297 | sb[i] = new SimStatsPacket.StatBlock(); |
@@ -288,13 +301,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
288 | sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); | 301 | sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); |
289 | 302 | ||
290 | sb[1].StatID = (uint) Stats.SimFPS; | 303 | sb[1].StatID = (uint) Stats.SimFPS; |
291 | sb[1].StatValue = reportedFPS / statsUpdateFactor; | 304 | sb[1].StatValue = reportedFPS / m_statsUpdateFactor; |
292 | 305 | ||
293 | sb[2].StatID = (uint) Stats.PhysicsFPS; | 306 | sb[2].StatID = (uint) Stats.PhysicsFPS; |
294 | sb[2].StatValue = physfps / statsUpdateFactor; | 307 | sb[2].StatValue = physfps / m_statsUpdateFactor; |
295 | 308 | ||
296 | sb[3].StatID = (uint) Stats.AgentUpdates; | 309 | sb[3].StatID = (uint) Stats.AgentUpdates; |
297 | sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); | 310 | sb[3].StatValue = (m_agentUpdates / m_statsUpdateFactor); |
298 | 311 | ||
299 | sb[4].StatID = (uint) Stats.Agents; | 312 | sb[4].StatID = (uint) Stats.Agents; |
300 | sb[4].StatValue = m_rootAgents; | 313 | sb[4].StatValue = m_rootAgents; |
@@ -309,31 +322,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
309 | sb[7].StatValue = m_activePrim; | 322 | sb[7].StatValue = m_activePrim; |
310 | 323 | ||
311 | sb[8].StatID = (uint)Stats.FrameMS; | 324 | sb[8].StatID = (uint)Stats.FrameMS; |
312 | sb[8].StatValue = m_frameMS / statsUpdateFactor; | 325 | sb[8].StatValue = m_frameMS / framesUpdated; |
313 | 326 | ||
314 | sb[9].StatID = (uint)Stats.NetMS; | 327 | sb[9].StatID = (uint)Stats.NetMS; |
315 | sb[9].StatValue = m_netMS / statsUpdateFactor; | 328 | sb[9].StatValue = m_netMS / framesUpdated; |
316 | 329 | ||
317 | sb[10].StatID = (uint)Stats.PhysicsMS; | 330 | sb[10].StatID = (uint)Stats.PhysicsMS; |
318 | sb[10].StatValue = m_physicsMS / statsUpdateFactor; | 331 | sb[10].StatValue = m_physicsMS / framesUpdated; |
319 | 332 | ||
320 | sb[11].StatID = (uint)Stats.ImageMS ; | 333 | sb[11].StatID = (uint)Stats.ImageMS ; |
321 | sb[11].StatValue = m_imageMS / statsUpdateFactor; | 334 | sb[11].StatValue = m_imageMS / framesUpdated; |
322 | 335 | ||
323 | sb[12].StatID = (uint)Stats.OtherMS; | 336 | sb[12].StatID = (uint)Stats.OtherMS; |
324 | sb[12].StatValue = m_otherMS / statsUpdateFactor; | 337 | sb[12].StatValue = m_otherMS / framesUpdated; |
325 | 338 | ||
326 | sb[13].StatID = (uint)Stats.InPacketsPerSecond; | 339 | sb[13].StatID = (uint)Stats.InPacketsPerSecond; |
327 | sb[13].StatValue = (m_inPacketsPerSecond / statsUpdateFactor); | 340 | sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); |
328 | 341 | ||
329 | sb[14].StatID = (uint)Stats.OutPacketsPerSecond; | 342 | sb[14].StatID = (uint)Stats.OutPacketsPerSecond; |
330 | sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); | 343 | sb[14].StatValue = (m_outPacketsPerSecond / m_statsUpdateFactor); |
331 | 344 | ||
332 | sb[15].StatID = (uint)Stats.UnAckedBytes; | 345 | sb[15].StatID = (uint)Stats.UnAckedBytes; |
333 | sb[15].StatValue = m_unAckedBytes; | 346 | sb[15].StatValue = m_unAckedBytes; |
334 | 347 | ||
335 | sb[16].StatID = (uint)Stats.AgentMS; | 348 | sb[16].StatID = (uint)Stats.AgentMS; |
336 | sb[16].StatValue = m_agentMS / statsUpdateFactor; | 349 | sb[16].StatValue = m_agentMS / framesUpdated; |
337 | 350 | ||
338 | sb[17].StatID = (uint)Stats.PendingDownloads; | 351 | sb[17].StatID = (uint)Stats.PendingDownloads; |
339 | sb[17].StatValue = m_pendingDownloads; | 352 | sb[17].StatValue = m_pendingDownloads; |
@@ -345,7 +358,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
345 | sb[19].StatValue = m_activeScripts; | 358 | sb[19].StatValue = m_activeScripts; |
346 | 359 | ||
347 | sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; | 360 | sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; |
348 | sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; | 361 | sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; |
349 | 362 | ||
350 | for (int i = 0; i < 21; i++) | 363 | for (int i = 0; i < 21; i++) |
351 | { | 364 | { |
@@ -366,7 +379,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
366 | // Extra statistics that aren't currently sent to clients | 379 | // Extra statistics that aren't currently sent to clients |
367 | lock (m_lastReportedExtraSimStats) | 380 | lock (m_lastReportedExtraSimStats) |
368 | { | 381 | { |
369 | m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / statsUpdateFactor; | 382 | m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / m_statsUpdateFactor; |
370 | 383 | ||
371 | Dictionary<string, float> physicsStats = m_scene.PhysicsScene.GetStats(); | 384 | Dictionary<string, float> physicsStats = m_scene.PhysicsScene.GetStats(); |
372 | 385 | ||
@@ -374,7 +387,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
374 | { | 387 | { |
375 | foreach (KeyValuePair<string, float> tuple in physicsStats) | 388 | foreach (KeyValuePair<string, float> tuple in physicsStats) |
376 | { | 389 | { |
377 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / statsUpdateFactor; | 390 | // FIXME: An extremely dirty hack to divide MS stats per frame rather than per second |
391 | // Need to change things so that stats source can indicate whether they are per second or | ||
392 | // per frame. | ||
393 | if (tuple.Key.EndsWith("MS")) | ||
394 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / framesUpdated; | ||
395 | else | ||
396 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor; | ||
378 | } | 397 | } |
379 | } | 398 | } |
380 | } | 399 | } |