* Patch from Misterblue to fix Environment.TickCount for statistics purposes. Resolves the wrap-around of the 32 bit uint.

* Teravus moved the Environment methods to the Util class
mysql-performance
Teravus Ovares (Dan Olivares) 2009-11-29 05:06:25 -05:00
parent 9fd9211a38
commit 4338f4e1d7
6 changed files with 305 additions and 254 deletions

View File

@ -97,6 +97,7 @@ what it is today.
* Mike Osias (IBM) * Mike Osias (IBM)
* Mike Pitman (IBM) * Mike Pitman (IBM)
* mikkopa/_someone - RealXtend * mikkopa/_someone - RealXtend
* Misterblue (Intel)
* Mircea Kitsune * Mircea Kitsune
* mpallari * mpallari
* nornalbion * nornalbion

View File

@ -1390,5 +1390,29 @@ namespace OpenSim.Framework
} }
#endregion FireAndForget Threading Pattern #endregion FireAndForget Threading Pattern
/// <summary>
/// Environment.TickCount is an int but it counts all 32 bits so it goes positive
/// and negative every 24.9 days. This trims down TickCount so it doesn't wrap
/// for the callers.
/// This trims it to a 12 day interval so don't let your frame time get too long.
/// </summary>
/// <returns></returns>
public static Int32 EnvironmentTickCount()
{
return Environment.TickCount & EnvironmentTickCountMask;
}
const Int32 EnvironmentTickCountMask = 0x3fffffff;
/// <summary>
/// Environment.TickCount is an int but it counts all 32 bits so it goes positive
/// and negative every 24.9 days. Subtracts the passed value (previously fetched by
/// 'EnvironmentTickCount()') and accounts for any wrapping.
/// </summary>
/// <returns>subtraction of passed prevValue from current Environment.TickCount</returns>
public static Int32 EnvironmentTickCountSubtract(Int32 prevValue)
{
Int32 diff = EnvironmentTickCount() - prevValue;
return (diff >= 0) ? diff : (diff + EnvironmentTickCountMask + 1);
}
} }
} }

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using System.Threading;
using log4net; using log4net;
using OpenSim.Framework; using OpenSim.Framework;
using OpenMetaverse; using OpenMetaverse;
@ -430,6 +431,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_udpServer.SendPacketFinal(nextPacket); m_udpServer.SendPacketFinal(nextPacket);
m_nextPackets[i] = null; m_nextPackets[i] = null;
packetSent = true; packetSent = true;
this.PacketsSent++;
} }
} }
else else
@ -446,6 +448,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Send the packet // Send the packet
m_udpServer.SendPacketFinal(packet); m_udpServer.SendPacketFinal(packet);
packetSent = true; packetSent = true;
this.PacketsSent++;
} }
else else
{ {

View File

@ -310,7 +310,7 @@ namespace OpenSim.Region.Framework.Scenes
private Thread HeartbeatThread; private Thread HeartbeatThread;
private volatile bool shuttingdown; private volatile bool shuttingdown;
private int m_lastUpdate = Environment.TickCount; private int m_lastUpdate;
private bool m_firstHeartbeat = true; private bool m_firstHeartbeat = true;
private UpdatePrioritizationSchemes m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; private UpdatePrioritizationSchemes m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time;
@ -526,6 +526,7 @@ namespace OpenSim.Region.Framework.Scenes
m_regionHandle = m_regInfo.RegionHandle; m_regionHandle = m_regInfo.RegionHandle;
m_regionName = m_regInfo.RegionName; m_regionName = m_regInfo.RegionName;
m_datastore = m_regInfo.DataStore; m_datastore = m_regInfo.DataStore;
m_lastUpdate = Util.EnvironmentTickCount();
m_physicalPrim = physicalPrim; m_physicalPrim = physicalPrim;
m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor; m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor;
@ -735,6 +736,8 @@ namespace OpenSim.Region.Framework.Scenes
m_regInfo = regInfo; m_regInfo = regInfo;
m_eventManager = new EventManager(); m_eventManager = new EventManager();
m_lastUpdate = Util.EnvironmentTickCount();
} }
#endregion #endregion
@ -1089,7 +1092,7 @@ namespace OpenSim.Region.Framework.Scenes
HeartbeatThread.Abort(); HeartbeatThread.Abort();
HeartbeatThread = null; HeartbeatThread = null;
} }
m_lastUpdate = Environment.TickCount; m_lastUpdate = Util.EnvironmentTickCount();
HeartbeatThread = Watchdog.StartThread(Heartbeat, "Heartbeat for region " + RegionInfo.RegionName, ThreadPriority.Normal, false); HeartbeatThread = Watchdog.StartThread(Heartbeat, "Heartbeat for region " + RegionInfo.RegionName, ThreadPriority.Normal, false);
} }
@ -1130,7 +1133,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
Update(); Update();
m_lastUpdate = Environment.TickCount; m_lastUpdate = Util.EnvironmentTickCount();
m_firstHeartbeat = false; m_firstHeartbeat = false;
} }
catch (ThreadAbortException) catch (ThreadAbortException)
@ -1158,8 +1161,9 @@ namespace OpenSim.Region.Framework.Scenes
TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate;
physicsFPS = 0f; physicsFPS = 0f;
maintc = otherMS = Environment.TickCount; maintc = Util.EnvironmentTickCount();
int tmpFrameMS = maintc; int tmpFrameMS = maintc;
tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0;
// Increment the frame counter // Increment the frame counter
++m_frame; ++m_frame;
@ -1179,16 +1183,15 @@ namespace OpenSim.Region.Framework.Scenes
if (m_frame % m_update_presences == 0) if (m_frame % m_update_presences == 0)
m_sceneGraph.UpdatePresences(); m_sceneGraph.UpdatePresences();
int TempPhysicsMS2 = Environment.TickCount; int tmpPhysicsMS2 = Util.EnvironmentTickCount();
if ((m_frame % m_update_physics == 0) && m_physics_enabled) if ((m_frame % m_update_physics == 0) && m_physics_enabled)
m_sceneGraph.UpdatePreparePhysics(); m_sceneGraph.UpdatePreparePhysics();
TempPhysicsMS2 = Environment.TickCount - TempPhysicsMS2; physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2);
physicsMS2 = TempPhysicsMS2;
if (m_frame % m_update_entitymovement == 0) if (m_frame % m_update_entitymovement == 0)
m_sceneGraph.UpdateScenePresenceMovement(); m_sceneGraph.UpdateScenePresenceMovement();
int TempPhysicsMS = Environment.TickCount; int tmpPhysicsMS = Util.EnvironmentTickCount();
if (m_frame % m_update_physics == 0) if (m_frame % m_update_physics == 0)
{ {
if (m_physics_enabled) if (m_physics_enabled)
@ -1196,57 +1199,49 @@ namespace OpenSim.Region.Framework.Scenes
if (SynchronizeScene != null) if (SynchronizeScene != null)
SynchronizeScene(this); SynchronizeScene(this);
} }
TempPhysicsMS = Environment.TickCount - TempPhysicsMS; physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS);
physicsMS = TempPhysicsMS;
// Delete temp-on-rez stuff // Delete temp-on-rez stuff
if (m_frame % m_update_backup == 0) if (m_frame % m_update_backup == 0)
{ {
int tozMS = Environment.TickCount; int tmpTempOnRezMS = Util.EnvironmentTickCount();
CleanTempObjects(); CleanTempObjects();
tozMS -= Environment.TickCount; tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS);
tempOnRezMS = tozMS;
} }
if (RegionStatus != RegionStatus.SlaveScene) if (RegionStatus != RegionStatus.SlaveScene)
{ {
if (m_frame % m_update_events == 0) if (m_frame % m_update_events == 0)
{ {
int evMS = Environment.TickCount; int evMS = Util.EnvironmentTickCount();
UpdateEvents(); UpdateEvents();
evMS -= Environment.TickCount; eventMS = Util.EnvironmentTickCountSubtract(evMS); ;
eventMS = evMS;
} }
if (m_frame % m_update_backup == 0) if (m_frame % m_update_backup == 0)
{ {
int backMS = Environment.TickCount; int backMS = Util.EnvironmentTickCount();
UpdateStorageBackup(); UpdateStorageBackup();
backMS -= Environment.TickCount; backupMS = Util.EnvironmentTickCountSubtract(backMS);
backupMS = backMS;
} }
if (m_frame % m_update_terrain == 0) if (m_frame % m_update_terrain == 0)
{ {
int terMS = Environment.TickCount; int terMS = Util.EnvironmentTickCount();
UpdateTerrain(); UpdateTerrain();
terMS -= Environment.TickCount; terrainMS = Util.EnvironmentTickCountSubtract(terMS);
terrainMS = terMS;
} }
if (m_frame % m_update_land == 0) if (m_frame % m_update_land == 0)
{ {
int ldMS = Environment.TickCount; int ldMS = Util.EnvironmentTickCount();
UpdateLand(); UpdateLand();
ldMS -= Environment.TickCount; landMS = Util.EnvironmentTickCountSubtract(ldMS);
landMS = ldMS;
} }
int tickCount = Environment.TickCount; frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS);
otherMS = tickCount - otherMS; otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
tmpFrameMS -= tickCount; lastCompletedFrame = Util.EnvironmentTickCount();
frameMS = tmpFrameMS;
lastCompletedFrame = tickCount;
// if (m_frame%m_update_avatars == 0) // if (m_frame%m_update_avatars == 0)
// UpdateInWorldTime(); // UpdateInWorldTime();
@ -1300,7 +1295,7 @@ namespace OpenSim.Region.Framework.Scenes
m_lastupdate = DateTime.UtcNow; m_lastupdate = DateTime.UtcNow;
} }
maintc = Environment.TickCount - maintc; maintc = Util.EnvironmentTickCountSubtract(maintc);
maintc = (int)(m_timespan * 1000) - maintc; maintc = (int)(m_timespan * 1000) - maintc;
if ((maintc < (m_timespan * 1000)) && maintc > 0) if ((maintc < (m_timespan * 1000)) && maintc > 0)
@ -1312,6 +1307,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
public void AddGroupTarget(SceneObjectGroup grp) public void AddGroupTarget(SceneObjectGroup grp)
{ {
lock (m_groupsWithTargets) lock (m_groupsWithTargets)
@ -2587,7 +2583,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
m_LastLogin = Environment.TickCount; m_LastLogin = Util.EnvironmentTickCount();
EventManager.TriggerOnNewClient(client); EventManager.TriggerOnNewClient(client);
} }
@ -4656,14 +4652,14 @@ namespace OpenSim.Region.Framework.Scenes
// //
int health=1; // Start at 1, means we're up int health=1; // Start at 1, means we're up
if ((Environment.TickCount - m_lastUpdate) < 1000) if ((Util.EnvironmentTickCountSubtract(m_lastUpdate)) < 1000)
health+=1; health+=1;
else else
return health; return health;
// A login in the last 4 mins? We can't be doing too badly // A login in the last 4 mins? We can't be doing too badly
// //
if ((Environment.TickCount - m_LastLogin) < 240000) if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000)
health++; health++;
else else
return health; return health;
@ -4861,7 +4857,7 @@ namespace OpenSim.Region.Framework.Scenes
if (m_firstHeartbeat) if (m_firstHeartbeat)
return; return;
if (System.Environment.TickCount - m_lastUpdate > 2000) if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000)
StartTimer(); StartTimer();
} }
} }

View File

@ -755,13 +755,37 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void SendPrimUpdates() public void SendPrimUpdates()
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
m_sceneViewer.SendPrimUpdates(); m_sceneViewer.SendPrimUpdates();
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
} }
/// <summary>
/// Environment.TickCount is an int but it counts all 32 bits so it goes positive
/// and negative every 24.9 days. This trims down TickCount so it doesn't wrap
/// for the callers.
/// This trims it to a 12 day interval so don't let your frame time get too long.
/// </summary>
/// <returns></returns>
const Int32 EnvironmentTickCountMask = 0x3fffffff;
private static Int32 EnvironmentTickCount() {
return Environment.TickCount & EnvironmentTickCountMask;
}
/// <summary>
/// Environment.TickCount is an int but it counts all 32 bits so it goes positive
/// and negative every 24.9 days. Subtracts the passed value (previously fetched by
/// 'EnvironmentTickCount()') and accounts for any wrapping.
/// </summary>
/// <returns>subtraction of passed prevValue from current Environment.TickCount</returns>
private static Int32 EnvironmentTickCountSubtract(Int32 prevValue) {
Int32 diff = EnvironmentTickCount() - prevValue;
return (diff >= 0) ? diff : (diff + EnvironmentTickCountMask + 1);
}
#region Status Methods #region Status Methods
/// <summary> /// <summary>
@ -1148,7 +1172,7 @@ namespace OpenSim.Region.Framework.Scenes
// return; // return;
//} //}
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
++m_movementUpdateCount; ++m_movementUpdateCount;
if (m_movementUpdateCount < 1) if (m_movementUpdateCount < 1)
@ -1464,7 +1488,7 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.EventManager.TriggerOnClientMovement(this); m_scene.EventManager.TriggerOnClientMovement(this);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
} }
public void DoAutoPilot(uint not_used, Vector3 Pos, IClientAPI remote_client) public void DoAutoPilot(uint not_used, Vector3 Pos, IClientAPI remote_client)
@ -1924,7 +1948,7 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
Rotation = rotation; Rotation = rotation;
Vector3 direc = vec * rotation; Vector3 direc = vec * rotation;
@ -1966,7 +1990,7 @@ namespace OpenSim.Region.Framework.Scenes
// TODO: Add the force instead of only setting it to support multiple forces per frame? // TODO: Add the force instead of only setting it to support multiple forces per frame?
m_forceToApply = direc; m_forceToApply = direc;
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
} }
#endregion #endregion
@ -2032,7 +2056,7 @@ namespace OpenSim.Region.Framework.Scenes
// server. // server.
if (remoteClient.IsActive) if (remoteClient.IsActive)
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
PhysicsActor actor = m_physicsActor; PhysicsActor actor = m_physicsActor;
Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero; Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
@ -2045,7 +2069,7 @@ namespace OpenSim.Region.Framework.Scenes
remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient))); pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
m_scene.StatsReporter.AddAgentUpdates(1); m_scene.StatsReporter.AddAgentUpdates(1);
} }
} }
@ -2055,11 +2079,11 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void SendTerseUpdateToAllClients() public void SendTerseUpdateToAllClients()
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
m_scene.ForEachClient(SendTerseUpdateToClient); m_scene.ForEachClient(SendTerseUpdateToClient);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
} }
public void SendCoarseLocations() public void SendCoarseLocations()
@ -2079,7 +2103,7 @@ namespace OpenSim.Region.Framework.Scenes
public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p) public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p)
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
List<Vector3> CoarseLocations = new List<Vector3>(); List<Vector3> CoarseLocations = new List<Vector3>();
List<UUID> AvatarUUIDs = new List<UUID>(); List<UUID> AvatarUUIDs = new List<UUID>();
@ -2115,7 +2139,7 @@ namespace OpenSim.Region.Framework.Scenes
m_controllingClient.SendCoarseLocationUpdate(AvatarUUIDs, CoarseLocations); m_controllingClient.SendCoarseLocationUpdate(AvatarUUIDs, CoarseLocations);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
} }
public void CoarseLocationChange() public void CoarseLocationChange()
@ -2152,7 +2176,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void SendInitialFullUpdateToAllClients() public void SendInitialFullUpdateToAllClients()
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
ScenePresence[] avatars = m_scene.GetScenePresences(); ScenePresence[] avatars = m_scene.GetScenePresences();
@ -2178,14 +2202,14 @@ namespace OpenSim.Region.Framework.Scenes
} }
m_scene.StatsReporter.AddAgentUpdates(avatars.Length); m_scene.StatsReporter.AddAgentUpdates(avatars.Length);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
//Animator.SendAnimPack(); //Animator.SendAnimPack();
} }
public void SendFullUpdateToAllClients() public void SendFullUpdateToAllClients()
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
// only send update from root agents to other clients; children are only "listening posts" // only send update from root agents to other clients; children are only "listening posts"
List<ScenePresence> avatars = m_scene.GetAvatars(); List<ScenePresence> avatars = m_scene.GetAvatars();
@ -2195,7 +2219,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
m_scene.StatsReporter.AddAgentUpdates(avatars.Count); m_scene.StatsReporter.AddAgentUpdates(avatars.Count);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
Animator.SendAnimPack(); Animator.SendAnimPack();
} }
@ -2237,7 +2261,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void SendAppearanceToAllOtherAgents() public void SendAppearanceToAllOtherAgents()
{ {
m_perfMonMS = Environment.TickCount; m_perfMonMS = EnvironmentTickCount();
m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
{ {
@ -2247,7 +2271,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
}); });
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(EnvironmentTickCountSubtract(m_perfMonMS));
} }
/// <summary> /// <summary>

View File

@ -193,6 +193,9 @@ namespace OpenSim.Region.Framework.Scenes
// / 10 divides the value by the number of times the sim heartbeat runs (10fps) // / 10 divides the value by the number of times the sim heartbeat runs (10fps)
// Then we divide the whole amount by the amount of seconds pass in between stats updates. // Then we divide the whole amount by the amount of seconds pass in between stats updates.
// 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change
// values to X-per-second values.
for (int i = 0; i<21;i++) for (int i = 0; i<21;i++)
{ {
sb[i] = new SimStatsPacket.StatBlock(); sb[i] = new SimStatsPacket.StatBlock();