diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SimStatsReporter.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SimStatsReporter.cs | 124 |
1 files changed, 76 insertions, 48 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index b9d615e..5398ab9 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs | |||
@@ -175,7 +175,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
175 | 175 | ||
176 | // saved last reported value so there is something available for llGetRegionFPS | 176 | // saved last reported value so there is something available for llGetRegionFPS |
177 | private float lastReportedSimFPS; | 177 | private float lastReportedSimFPS; |
178 | private float[] lastReportedSimStats = new float[22]; | 178 | private float[] lastReportedSimStats = new float[23]; |
179 | private float m_pfps; | 179 | private float m_pfps; |
180 | 180 | ||
181 | /// <summary> | 181 | /// <summary> |
@@ -189,12 +189,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
189 | private int m_objectUpdates; | 189 | private int m_objectUpdates; |
190 | 190 | ||
191 | private int m_frameMS; | 191 | private int m_frameMS; |
192 | private int m_spareMS; | 192 | |
193 | private int m_netMS; | 193 | private int m_netMS; |
194 | private int m_agentMS; | 194 | private int m_agentMS; |
195 | private int m_physicsMS; | 195 | private int m_physicsMS; |
196 | private int m_imageMS; | 196 | private int m_imageMS; |
197 | private int m_otherMS; | 197 | private int m_otherMS; |
198 | private int m_sleeptimeMS; | ||
198 | 199 | ||
199 | //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. | 200 | //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. |
200 | //Ckrinke private int m_scriptMS = 0; | 201 | //Ckrinke private int m_scriptMS = 0; |
@@ -289,7 +290,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
289 | 290 | ||
290 | private void statsHeartBeat(object sender, EventArgs e) | 291 | private void statsHeartBeat(object sender, EventArgs e) |
291 | { | 292 | { |
292 | SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[22]; | 293 | SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[23]; |
293 | SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); | 294 | SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); |
294 | 295 | ||
295 | // Know what's not thread safe in Mono... modifying timers. | 296 | // Know what's not thread safe in Mono... modifying timers. |
@@ -327,6 +328,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
327 | physfps = 0; | 328 | physfps = 0; |
328 | 329 | ||
329 | #endregion | 330 | #endregion |
331 | float factor = 1 / m_statsUpdateFactor; | ||
332 | |||
333 | if (reportedFPS <= 0) | ||
334 | reportedFPS = 1; | ||
335 | |||
336 | float perframe = 1.0f / (float)reportedFPS; | ||
337 | |||
338 | float TotalFrameTime = m_frameMS * perframe; | ||
339 | |||
340 | float targetframetime = 1100.0f / (float)m_nominalReportedFps; | ||
341 | |||
342 | float sparetime; | ||
343 | float sleeptime; | ||
344 | |||
345 | if (TotalFrameTime > targetframetime) | ||
346 | { | ||
347 | sparetime = 0; | ||
348 | sleeptime = 0; | ||
349 | } | ||
350 | else | ||
351 | { | ||
352 | sparetime = m_frameMS - m_physicsMS - m_agentMS; | ||
353 | sparetime *= perframe; | ||
354 | if (sparetime < 0) | ||
355 | sparetime = 0; | ||
356 | else if (sparetime > TotalFrameTime) | ||
357 | sparetime = TotalFrameTime; | ||
358 | sleeptime = m_sleeptimeMS * perframe; | ||
359 | } | ||
330 | 360 | ||
331 | m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); | 361 | m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); |
332 | m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); | 362 | m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); |
@@ -338,25 +368,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
338 | // so that stat numbers are always consistent. | 368 | // so that stat numbers are always consistent. |
339 | CheckStatSanity(); | 369 | CheckStatSanity(); |
340 | 370 | ||
341 | //Our time dilation is 0.91 when we're running a full speed, | 371 | // other MS is actually simulation time |
342 | // therefore to make sure we get an appropriate range, | 372 | // m_otherMS = m_frameMS - m_physicsMS - m_imageMS - m_netMS - m_agentMS; |
343 | // we have to factor in our error. (0.10f * statsUpdateFactor) | 373 | // m_imageMS m_netMS are not included in m_frameMS |
344 | // multiplies the fix for the error times the amount of times it'll occur a second | ||
345 | // / 10 divides the value by the number of times the sim heartbeat runs (10fps) | ||
346 | // Then we divide the whole amount by the amount of seconds pass in between stats updates. | ||
347 | |||
348 | // 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change | ||
349 | // values to X-per-second values. | ||
350 | 374 | ||
351 | uint thisFrame = m_scene.Frame; | 375 | m_otherMS = m_frameMS - m_physicsMS - m_agentMS - m_sleeptimeMS; |
352 | float framesUpdated = (float)(thisFrame - m_lastUpdateFrame) * m_reportedFpsCorrectionFactor; | 376 | if (m_otherMS < 0) |
353 | m_lastUpdateFrame = thisFrame; | 377 | m_otherMS = 0; |
354 | 378 | ||
355 | // Avoid div-by-zero if somehow we've not updated any frames. | 379 | for (int i = 0; i < 23; i++) |
356 | if (framesUpdated == 0) | ||
357 | framesUpdated = 1; | ||
358 | |||
359 | for (int i = 0; i < 22; i++) | ||
360 | { | 380 | { |
361 | sb[i] = new SimStatsPacket.StatBlock(); | 381 | sb[i] = new SimStatsPacket.StatBlock(); |
362 | } | 382 | } |
@@ -386,19 +406,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
386 | sb[7].StatValue = m_activePrim; | 406 | sb[7].StatValue = m_activePrim; |
387 | 407 | ||
388 | sb[8].StatID = (uint)Stats.FrameMS; | 408 | sb[8].StatID = (uint)Stats.FrameMS; |
389 | sb[8].StatValue = m_frameMS / framesUpdated; | 409 | sb[8].StatValue = TotalFrameTime; |
390 | 410 | ||
391 | sb[9].StatID = (uint)Stats.NetMS; | 411 | sb[9].StatID = (uint)Stats.NetMS; |
392 | sb[9].StatValue = m_netMS / framesUpdated; | 412 | sb[9].StatValue = m_netMS * perframe; |
393 | 413 | ||
394 | sb[10].StatID = (uint)Stats.PhysicsMS; | 414 | sb[10].StatID = (uint)Stats.PhysicsMS; |
395 | sb[10].StatValue = m_physicsMS / framesUpdated; | 415 | sb[10].StatValue = m_physicsMS * perframe; |
396 | 416 | ||
397 | sb[11].StatID = (uint)Stats.ImageMS ; | 417 | sb[11].StatID = (uint)Stats.ImageMS ; |
398 | sb[11].StatValue = m_imageMS / framesUpdated; | 418 | sb[11].StatValue = m_imageMS * perframe; |
399 | 419 | ||
400 | sb[12].StatID = (uint)Stats.OtherMS; | 420 | sb[12].StatID = (uint)Stats.OtherMS; |
401 | sb[12].StatValue = m_otherMS / framesUpdated; | 421 | sb[12].StatValue = m_otherMS * perframe; |
402 | 422 | ||
403 | sb[13].StatID = (uint)Stats.InPacketsPerSecond; | 423 | sb[13].StatID = (uint)Stats.InPacketsPerSecond; |
404 | sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); | 424 | sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); |
@@ -410,7 +430,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
410 | sb[15].StatValue = m_unAckedBytes; | 430 | sb[15].StatValue = m_unAckedBytes; |
411 | 431 | ||
412 | sb[16].StatID = (uint)Stats.AgentMS; | 432 | sb[16].StatID = (uint)Stats.AgentMS; |
413 | sb[16].StatValue = m_agentMS / framesUpdated; | 433 | sb[16].StatValue = m_agentMS * perframe; |
414 | 434 | ||
415 | sb[17].StatID = (uint)Stats.PendingDownloads; | 435 | sb[17].StatID = (uint)Stats.PendingDownloads; |
416 | sb[17].StatValue = m_pendingDownloads; | 436 | sb[17].StatValue = m_pendingDownloads; |
@@ -425,7 +445,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
425 | sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; | 445 | sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; |
426 | 446 | ||
427 | sb[21].StatID = (uint)Stats.SimSpareMs; | 447 | sb[21].StatID = (uint)Stats.SimSpareMs; |
428 | sb[21].StatValue = m_spareMS / framesUpdated; | 448 | sb[21].StatValue = sparetime; |
449 | |||
450 | sb[22].StatID = (uint)Stats.SimSleepMs; | ||
451 | sb[22].StatValue = sleeptime; | ||
429 | 452 | ||
430 | for (int i = 0; i < 22; i++) | 453 | for (int i = 0; i < 22; i++) |
431 | { | 454 | { |
@@ -444,28 +467,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
444 | } | 467 | } |
445 | 468 | ||
446 | // Extra statistics that aren't currently sent to clients | 469 | // Extra statistics that aren't currently sent to clients |
447 | lock (m_lastReportedExtraSimStats) | 470 | if (m_scene.PhysicsScene != null) |
448 | { | 471 | { |
449 | m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / m_statsUpdateFactor; | 472 | lock (m_lastReportedExtraSimStats) |
450 | m_lastReportedExtraSimStats[SlowFramesStat.ShortName] = (float)SlowFramesStat.Value; | ||
451 | |||
452 | Dictionary<string, float> physicsStats = m_scene.PhysicsScene.GetStats(); | ||
453 | |||
454 | if (physicsStats != null) | ||
455 | { | 473 | { |
456 | foreach (KeyValuePair<string, float> tuple in physicsStats) | 474 | m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / m_statsUpdateFactor; |
475 | m_lastReportedExtraSimStats[SlowFramesStat.ShortName] = (float)SlowFramesStat.Value; | ||
476 | |||
477 | Dictionary<string, float> physicsStats = m_scene.PhysicsScene.GetStats(); | ||
478 | |||
479 | if (physicsStats != null) | ||
457 | { | 480 | { |
458 | // FIXME: An extremely dirty hack to divide MS stats per frame rather than per second | 481 | foreach (KeyValuePair<string, float> tuple in physicsStats) |
459 | // Need to change things so that stats source can indicate whether they are per second or | 482 | { |
460 | // per frame. | 483 | // FIXME: An extremely dirty hack to divide MS stats per frame rather than per second |
461 | if (tuple.Key.EndsWith("MS")) | 484 | // Need to change things so that stats source can indicate whether they are per second or |
462 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / framesUpdated; | 485 | // per frame. |
463 | else | 486 | if (tuple.Key.EndsWith("MS")) |
464 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor; | 487 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value * perframe; |
488 | else | ||
489 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor; | ||
490 | } | ||
465 | } | 491 | } |
466 | } | 492 | } |
467 | } | 493 | } |
468 | 494 | ||
495 | // LastReportedObjectUpdates = m_objectUpdates / m_statsUpdateFactor; | ||
469 | ResetValues(); | 496 | ResetValues(); |
470 | } | 497 | } |
471 | } | 498 | } |
@@ -488,7 +515,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
488 | m_physicsMS = 0; | 515 | m_physicsMS = 0; |
489 | m_imageMS = 0; | 516 | m_imageMS = 0; |
490 | m_otherMS = 0; | 517 | m_otherMS = 0; |
491 | m_spareMS = 0; | 518 | // m_spareMS = 0; |
519 | m_sleeptimeMS = 0; | ||
492 | 520 | ||
493 | //Ckrinke This variable is not used, so comment to remove compiler warning until it is used. | 521 | //Ckrinke This variable is not used, so comment to remove compiler warning until it is used. |
494 | //Ckrinke m_scriptMS = 0; | 522 | //Ckrinke m_scriptMS = 0; |
@@ -572,11 +600,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
572 | SlowFramesStat.Value++; | 600 | SlowFramesStat.Value++; |
573 | } | 601 | } |
574 | 602 | ||
575 | public void AddSpareMS(int ms) | ||
576 | { | ||
577 | m_spareMS += ms; | ||
578 | } | ||
579 | |||
580 | public void addNetMS(int ms) | 603 | public void addNetMS(int ms) |
581 | { | 604 | { |
582 | m_netMS += ms; | 605 | m_netMS += ms; |
@@ -602,6 +625,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
602 | m_otherMS += ms; | 625 | m_otherMS += ms; |
603 | } | 626 | } |
604 | 627 | ||
628 | public void addSleepMS(int ms) | ||
629 | { | ||
630 | m_sleeptimeMS += ms; | ||
631 | } | ||
632 | |||
605 | public void AddPendingDownloads(int count) | 633 | public void AddPendingDownloads(int count) |
606 | { | 634 | { |
607 | m_pendingDownloads += count; | 635 | m_pendingDownloads += count; |