aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
diff options
context:
space:
mode:
authorGlenn Martin2015-04-20 14:55:00 -0400
committerGlenn Martin2015-04-21 14:29:17 -0400
commit1959eb8372b6c8e35e1afa435504e9ef41dec958 (patch)
treed9cb670464215a7baeaee11638544635237f5eb7 /OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
parentRevert "Enable grab feature (Ctrl+Drag) for non-physical link-sets and add co... (diff)
downloadopensim-SC-1959eb8372b6c8e35e1afa435504e9ef41dec958.zip
opensim-SC-1959eb8372b6c8e35e1afa435504e9ef41dec958.tar.gz
opensim-SC-1959eb8372b6c8e35e1afa435504e9ef41dec958.tar.bz2
opensim-SC-1959eb8372b6c8e35e1afa435504e9ef41dec958.tar.xz
Moved over metrics from previous OpenSim 0.8.0.3 repository (this new repository is now the master branch from OpenSim).
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SimStatsReporter.cs')
-rwxr-xr-x[-rw-r--r--]OpenSim/Region/Framework/Scenes/SimStatsReporter.cs216
1 files changed, 203 insertions, 13 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
index 8f1e345..b6da636 100644..100755
--- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
+++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
@@ -61,6 +61,10 @@ namespace OpenSim.Region.Framework.Scenes
61 61
62 private YourStatsAreWrong handlerStatsIncorrect; 62 private YourStatsAreWrong handlerStatsIncorrect;
63 63
64 // Determines the size of the array that is used to collect StatBlocks
65 // for sending to the SimStats and SimExtraStatsCollector
66 private const int m_statisticArraySize = 26;
67
64 /// <summary> 68 /// <summary>
65 /// These are the IDs of stats sent in the StatsPacket to the viewer. 69 /// These are the IDs of stats sent in the StatsPacket to the viewer.
66 /// </summary> 70 /// </summary>
@@ -104,7 +108,11 @@ namespace OpenSim.Region.Framework.Scenes
104 ScriptEps = 31, 108 ScriptEps = 31,
105 SimSpareMs = 32, 109 SimSpareMs = 32,
106 SimSleepMs = 33, 110 SimSleepMs = 33,
107 SimIoPumpTime = 34 111 SimIoPumpTime = 34,
112 UsersLoggingIn = 35,
113 TotalGeoPrim = 36,
114 TotalMesh = 37,
115 ThreadCount = 38
108 } 116 }
109 117
110 /// <summary> 118 /// <summary>
@@ -175,7 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
175 183
176 // saved last reported value so there is something available for llGetRegionFPS 184 // saved last reported value so there is something available for llGetRegionFPS
177 private float lastReportedSimFPS; 185 private float lastReportedSimFPS;
178 private float[] lastReportedSimStats = new float[22]; 186 private float[] lastReportedSimStats = new float[m_statisticArraySize];
179 private float m_pfps; 187 private float m_pfps;
180 188
181 /// <summary> 189 /// <summary>
@@ -202,6 +210,8 @@ namespace OpenSim.Region.Framework.Scenes
202 private int m_rootAgents; 210 private int m_rootAgents;
203 private int m_childAgents; 211 private int m_childAgents;
204 private int m_numPrim; 212 private int m_numPrim;
213 private int m_numGeoPrim;
214 private int m_numMesh;
205 private int m_inPacketsPerSecond; 215 private int m_inPacketsPerSecond;
206 private int m_outPacketsPerSecond; 216 private int m_outPacketsPerSecond;
207 private int m_activePrim; 217 private int m_activePrim;
@@ -213,6 +223,34 @@ namespace OpenSim.Region.Framework.Scenes
213 223
214 private int m_objectCapacity = 45000; 224 private int m_objectCapacity = 45000;
215 225
226 // This is the number of frames that will be stored and then averaged for
227 // the Total, Simulation, Physics, and Network Frame Time; It is set to
228 // 10 by default but can be changed by the OpenSim.ini configuration file
229 // NumberOfFrames parameter
230 private int m_numberFramesStored = 10;
231
232 // The arrays that will hold the time it took to run the past N frames,
233 // where N is the num_frames_to_average given by the configuration file
234 private double[] m_totalFrameTimeMilliseconds;
235 private double[] m_simulationFrameTimeMilliseconds;
236 private double[] m_physicsFrameTimeMilliseconds;
237 private double[] m_networkFrameTimeMilliseconds;
238
239 // The location of the next time in milliseconds that will be
240 // (over)written when the next frame completes
241 private int m_nextLocation = 0;
242
243 // The correct number of frames that have completed since the last stats
244 // update for physics
245 private int m_numberPhysicsFrames;
246
247 // The current number of users attempting to login to the region
248 private int m_usersLoggingIn;
249
250 // The last reported value of threads from the SmartThreadPool inside of
251 // XEngine
252 private int m_inUseThreads;
253
216 private Scene m_scene; 254 private Scene m_scene;
217 255
218 private RegionInfo ReportingRegion; 256 private RegionInfo ReportingRegion;
@@ -223,6 +261,15 @@ namespace OpenSim.Region.Framework.Scenes
223 261
224 public SimStatsReporter(Scene scene) 262 public SimStatsReporter(Scene scene)
225 { 263 {
264 // Initialize the different frame time arrays to the correct sizes
265 m_totalFrameTimeMilliseconds = new double[m_numberFramesStored];
266 m_simulationFrameTimeMilliseconds = new double[m_numberFramesStored];
267 m_physicsFrameTimeMilliseconds = new double[m_numberFramesStored];
268 m_networkFrameTimeMilliseconds = new double[m_numberFramesStored];
269
270 // Initialize the current number of users logging into the region
271 m_usersLoggingIn = 0;
272
226 m_scene = scene; 273 m_scene = scene;
227 m_reportedFpsCorrectionFactor = scene.MinFrameSeconds * m_nominalReportedFps; 274 m_reportedFpsCorrectionFactor = scene.MinFrameSeconds * m_nominalReportedFps;
228 m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); 275 m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000);
@@ -256,6 +303,14 @@ namespace OpenSim.Region.Framework.Scenes
256 StatsManager.RegisterStat(SlowFramesStat); 303 StatsManager.RegisterStat(SlowFramesStat);
257 } 304 }
258 305
306
307 public SimStatsReporter(Scene scene, int numberOfFrames) : this (scene)
308 {
309 // Store the number of frames from the OpenSim.ini configuration file
310 m_numberFramesStored = numberOfFrames;
311 }
312
313
259 public void Close() 314 public void Close()
260 { 315 {
261 m_report.Elapsed -= TriggerStatsHeartbeat; 316 m_report.Elapsed -= TriggerStatsHeartbeat;
@@ -289,10 +344,21 @@ namespace OpenSim.Region.Framework.Scenes
289 344
290 private void statsHeartBeat(object sender, EventArgs e) 345 private void statsHeartBeat(object sender, EventArgs e)
291 { 346 {
347 double totalSumFrameTime;
348 double simulationSumFrameTime;
349 double physicsSumFrameTime;
350 double networkSumFrameTime;
351 float timeDilation;
352 int currentFrame;
353
292 if (!m_scene.Active) 354 if (!m_scene.Active)
293 return; 355 return;
294 356
295 SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[22]; 357 // Create arrays to hold the statistics for this current scene,
358 // these will be passed to the SimExtraStatsCollector, they are also
359 // sent to the SimStats class
360 SimStatsPacket.StatBlock[] sb = new
361 SimStatsPacket.StatBlock[m_statisticArraySize];
296 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); 362 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
297 363
298 // Know what's not thread safe in Mono... modifying timers. 364 // Know what's not thread safe in Mono... modifying timers.
@@ -314,14 +380,21 @@ namespace OpenSim.Region.Framework.Scenes
314 380
315#region various statistic googly moogly 381#region various statistic googly moogly
316 382
383 // ORIGINAL code commented out until we have time to add our own
384 // statistics to the statistics window, this will be done as a
385 // new section given the title of our current project
317 // We're going to lie about the FPS because we've been lying since 2008. The actual FPS is currently 386 // We're going to lie about the FPS because we've been lying since 2008. The actual FPS is currently
318 // locked at a maximum of 11. Maybe at some point this can change so that we're not lying. 387 // locked at a maximum of 11. Maybe at some point this can change so that we're not lying.
319 int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); 388 //int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor);
389 int reportedFPS = m_fps;
320 390
321 // save the reported value so there is something available for llGetRegionFPS 391 // save the reported value so there is something available for llGetRegionFPS
322 lastReportedSimFPS = reportedFPS / m_statsUpdateFactor; 392 lastReportedSimFPS = reportedFPS / m_statsUpdateFactor;
323 393
324 float physfps = ((m_pfps / 1000)); 394 // ORIGINAL code commented out until we have time to add our own
395 // statistics to the statistics window
396 //float physfps = ((m_pfps / 1000));
397 float physfps = m_numberPhysicsFrames;
325 398
326 //if (physfps > 600) 399 //if (physfps > 600)
327 //physfps = physfps - (physfps - 600); 400 //physfps = physfps - (physfps - 600);
@@ -334,6 +407,8 @@ namespace OpenSim.Region.Framework.Scenes
334 m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); 407 m_rootAgents = m_scene.SceneGraph.GetRootAgentCount();
335 m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); 408 m_childAgents = m_scene.SceneGraph.GetChildAgentCount();
336 m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount(); 409 m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount();
410 m_numGeoPrim = m_scene.SceneGraph.GetTotalPrimObjectsCount();
411 m_numMesh = m_scene.SceneGraph.GetTotalMeshObjectsCount();
337 m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount(); 412 m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount();
338 m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount(); 413 m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount();
339 414
@@ -359,13 +434,48 @@ namespace OpenSim.Region.Framework.Scenes
359 if (framesUpdated == 0) 434 if (framesUpdated == 0)
360 framesUpdated = 1; 435 framesUpdated = 1;
361 436
362 for (int i = 0; i < 22; i++) 437 for (int i = 0; i < m_statisticArraySize; i++)
363 { 438 {
364 sb[i] = new SimStatsPacket.StatBlock(); 439 sb[i] = new SimStatsPacket.StatBlock();
365 } 440 }
366 441
442 // Resetting the sums of the frame times to prevent any errors
443 // in calculating the moving average for frame time
444 totalSumFrameTime = 0;
445 simulationSumFrameTime = 0;
446 physicsSumFrameTime = 0;
447 networkSumFrameTime = 0;
448
449 // Loop through all the frames that were stored for the current
450 // heartbeat to process the moving average of frame times
451 for (int i = 0; i < m_numberFramesStored; i++)
452 {
453 // Sum up each frame time in order to calculate the moving
454 // average of frame time
455 totalSumFrameTime += m_totalFrameTimeMilliseconds[i];
456 simulationSumFrameTime +=
457 m_simulationFrameTimeMilliseconds[i];
458 physicsSumFrameTime += m_physicsFrameTimeMilliseconds[i];
459 networkSumFrameTime += m_networkFrameTimeMilliseconds[i];
460 }
461
462 // Get the index that represents the current frame based on the next one known; go back
463 // to the last index if next one is stated to restart at 0
464 if (m_nextLocation == 0)
465 currentFrame = m_numberFramesStored - 1;
466 else
467 currentFrame = m_nextLocation - 1;
468
469 // Calculate the time dilation; which is currently based on the ratio between the sum of the
470 // physics and simulation rate, and the set minimum time to run the scene's update; minFrameTime
471 // is given in seconds so multiply by 1000 to convert it to milliseconds
472 timeDilation = (float)(m_simulationFrameTimeMilliseconds[currentFrame] +
473 m_physicsFrameTimeMilliseconds[currentFrame]) / (m_scene.MinFrameTime * 1000);
474
475 // ORIGINAL code commented out until we have time to add our own
367 sb[0].StatID = (uint) Stats.TimeDilation; 476 sb[0].StatID = (uint) Stats.TimeDilation;
368 sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); 477 //sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor));
478 sb[0].StatValue = timeDilation;
369 479
370 sb[1].StatID = (uint) Stats.SimFPS; 480 sb[1].StatID = (uint) Stats.SimFPS;
371 sb[1].StatValue = reportedFPS / m_statsUpdateFactor; 481 sb[1].StatValue = reportedFPS / m_statsUpdateFactor;
@@ -388,20 +498,27 @@ namespace OpenSim.Region.Framework.Scenes
388 sb[7].StatID = (uint) Stats.ActivePrim; 498 sb[7].StatID = (uint) Stats.ActivePrim;
389 sb[7].StatValue = m_activePrim; 499 sb[7].StatValue = m_activePrim;
390 500
501 // ORIGINAL code commented out until we have time to add our own
502 // statistics to the statistics window
391 sb[8].StatID = (uint)Stats.FrameMS; 503 sb[8].StatID = (uint)Stats.FrameMS;
392 sb[8].StatValue = m_frameMS / framesUpdated; 504 //sb[8].StatValue = m_frameMS / framesUpdated;
505 sb[8].StatValue = (float) totalSumFrameTime / m_numberFramesStored;
393 506
394 sb[9].StatID = (uint)Stats.NetMS; 507 sb[9].StatID = (uint)Stats.NetMS;
395 sb[9].StatValue = m_netMS / framesUpdated; 508 //sb[9].StatValue = m_netMS / framesUpdated;
509 sb[9].StatValue = (float) networkSumFrameTime / m_numberFramesStored;
396 510
397 sb[10].StatID = (uint)Stats.PhysicsMS; 511 sb[10].StatID = (uint)Stats.PhysicsMS;
398 sb[10].StatValue = m_physicsMS / framesUpdated; 512 //sb[10].StatValue = m_physicsMS / framesUpdated;
513 sb[10].StatValue = (float) physicsSumFrameTime / m_numberFramesStored;
399 514
400 sb[11].StatID = (uint)Stats.ImageMS ; 515 sb[11].StatID = (uint)Stats.ImageMS ;
401 sb[11].StatValue = m_imageMS / framesUpdated; 516 sb[11].StatValue = m_imageMS / framesUpdated;
402 517
403 sb[12].StatID = (uint)Stats.OtherMS; 518 sb[12].StatID = (uint)Stats.OtherMS;
404 sb[12].StatValue = m_otherMS / framesUpdated; 519 //sb[12].StatValue = m_otherMS / framesUpdated;
520 sb[12].StatValue = (float) simulationSumFrameTime /
521 m_numberFramesStored;
405 522
406 sb[13].StatID = (uint)Stats.InPacketsPerSecond; 523 sb[13].StatID = (uint)Stats.InPacketsPerSecond;
407 sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); 524 sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor);
@@ -430,7 +547,25 @@ namespace OpenSim.Region.Framework.Scenes
430 sb[21].StatID = (uint)Stats.SimSpareMs; 547 sb[21].StatID = (uint)Stats.SimSpareMs;
431 sb[21].StatValue = m_spareMS / framesUpdated; 548 sb[21].StatValue = m_spareMS / framesUpdated;
432 549
433 for (int i = 0; i < 22; i++) 550 // Added to track the number of users currently attempting to
551 // login to the region
552 sb[22].StatID = (uint)Stats.UsersLoggingIn;
553 sb[22].StatValue = m_usersLoggingIn;
554
555 // Total number of geometric primitives in the scene
556 sb[23].StatID = (uint)Stats.TotalGeoPrim;
557 sb[23].StatValue = m_numGeoPrim;
558
559 // Total number of mesh objects in the scene
560 sb[24].StatID = (uint)Stats.TotalMesh;
561 sb[24].StatValue = m_numMesh;
562
563 // Added to track the current number of threads that XEngine is
564 // using
565 sb[25].StatID = (uint)Stats.ThreadCount;
566 sb[25].StatValue = m_inUseThreads;
567
568 for (int i = 0; i < m_statisticArraySize; i++)
434 { 569 {
435 lastReportedSimStats[i] = sb[i].StatValue; 570 lastReportedSimStats[i] = sb[i].StatValue;
436 } 571 }
@@ -475,6 +610,10 @@ namespace OpenSim.Region.Framework.Scenes
475 610
476 private void ResetValues() 611 private void ResetValues()
477 { 612 {
613 // Reset the number of frames that the physics library has
614 // processed since the last stats report
615 m_numberPhysicsFrames = 0;
616
478 m_timeDilation = 0; 617 m_timeDilation = 0;
479 m_fps = 0; 618 m_fps = 0;
480 m_pfps = 0; 619 m_pfps = 0;
@@ -605,6 +744,32 @@ namespace OpenSim.Region.Framework.Scenes
605 m_otherMS += ms; 744 m_otherMS += ms;
606 } 745 }
607 746
747 public void addPhysicsFrame(int frames)
748 {
749 // Add the number of physics frames to the correct total physics
750 // frames
751 m_numberPhysicsFrames += frames;
752 }
753
754 public void addFrameTimeMilliseconds(double total, double simulation,
755 double physics, double network)
756 {
757 // Save the frame times from the current frame into the appropriate
758 // arrays
759 m_totalFrameTimeMilliseconds[m_nextLocation] = total;
760 m_simulationFrameTimeMilliseconds[m_nextLocation] = simulation;
761 m_physicsFrameTimeMilliseconds[m_nextLocation] = physics;
762 m_networkFrameTimeMilliseconds[m_nextLocation] = network;
763
764 // Update to the next location in the list
765 m_nextLocation++;
766
767 // Since the list will begin to overwrite the oldest frame values
768 // first, the next location needs to loop back to the beginning of the
769 // list whenever it reaches the end
770 m_nextLocation = m_nextLocation % m_numberFramesStored;
771 }
772
608 public void AddPendingDownloads(int count) 773 public void AddPendingDownloads(int count)
609 { 774 {
610 m_pendingDownloads += count; 775 m_pendingDownloads += count;
@@ -627,6 +792,31 @@ namespace OpenSim.Region.Framework.Scenes
627 AddunAckedBytes(unAckedBytes); 792 AddunAckedBytes(unAckedBytes);
628 } 793 }
629 794
795 public void UpdateUsersLoggingIn(bool isLoggingIn)
796 {
797 // Determine whether the user has started logging in or has completed
798 // logging into the region
799 if (isLoggingIn)
800 {
801 // The user is starting to login to the region so increment the
802 // number of users attempting to login to the region
803 m_usersLoggingIn++;
804 }
805 else
806 {
807 // The user has finished logging into the region so decrement the
808 // number of users logging into the region
809 m_usersLoggingIn--;
810 }
811 }
812
813 public void SetThreadCount(int inUseThreads)
814 {
815 // Save the new number of threads to our member variable to send to
816 // the extra stats collector
817 m_inUseThreads = inUseThreads;
818 }
819
630 #endregion 820 #endregion
631 821
632 public Dictionary<string, float> GetExtraSimStats() 822 public Dictionary<string, float> GetExtraSimStats()