* Add asset/texture cache statistics to region server console

* You can type 'stats' at the REGION# prompt to get this information in grid or standalone mode
* Don't take these numbers as gospel yet, since for some reason textures displayed from inventory which require downloading from the server are being recorded as assets 
rather than textures
* But I don't have any reason to believe they aren't broadly accurate.
* I've put these in so I can tell whether the high memory usage on regions is down to the asset/texture cache
* This will require a prebuild
* DEV: Only adds needed to be implemented since, as far as I can tell, assets cached are currently never released.  For my part, seeing large cache memory numbers will 
provoke me to think about doing something about this.
* DEV: Now switched to using a singleton to get the stats reporters rather than threading the object through various layers
* DEV: Will refactor the other server stats reporters to do this in one of the next commits
ThreadPoolClientBranch
Justin Clarke Casey 2008-01-31 00:42:31 +00:00
parent 881f295e70
commit a4bf98f4ba
6 changed files with 165 additions and 6 deletions

View File

@ -31,7 +31,9 @@ using System.Collections.Generic;
using System.Threading;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework.Console;
using OpenSim.Framework.Statistics;
namespace OpenSim.Framework.Communications.Cache
{
@ -220,9 +222,13 @@ namespace OpenSim.Framework.Communications.Cache
result = "Duplicate ignored.";
}
else
{
TextureImage textur = new TextureImage(asset);
{
TextureImage textur = new TextureImage(asset);
Textures.Add(textur.FullID, textur);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddTexture(textur);
if (asset.Temporary)
{
result = "Added to cache";
@ -244,6 +250,10 @@ namespace OpenSim.Framework.Communications.Cache
{
AssetInfo assetInf = new AssetInfo(asset);
Assets.Add(assetInf.FullID, assetInf);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddAsset(assetInf);
if (asset.Temporary)
{
result = "Added to cache";
@ -292,8 +302,12 @@ namespace OpenSim.Framework.Communications.Cache
TextureImage image = new TextureImage(asset);
if (!Textures.ContainsKey(image.FullID))
{
{
Textures.Add(image.FullID, image);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddTexture(image);
if (RequestedTextures.ContainsKey(image.FullID))
{
AssetRequest req = RequestedTextures[image.FullID];
@ -312,6 +326,10 @@ namespace OpenSim.Framework.Communications.Cache
if (!Assets.ContainsKey(assetInf.FullID))
{
Assets.Add(assetInf.FullID, assetInf);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddAsset(assetInf);
if (RequestedAssets.ContainsKey(assetInf.FullID))
{
AssetRequest req = RequestedAssets[assetInf.FullID];

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
using OpenSim.Framework;
namespace OpenSim.Framework.Statistics
{
public class SimExtraStatsReporter
{
private long assetsInCache;
private long texturesInCache;
private long assetCacheMemoryUsage;
private long textureCacheMemoryUsage;
public long AssetsInCache { get { return assetsInCache; } }
public long TexturesInCache { get { return texturesInCache; } }
public long AssetCacheMemoryUsage { get { return assetCacheMemoryUsage; } }
public long TextureCacheMemoryUsage { get { return textureCacheMemoryUsage; } }
public void AddAsset(AssetBase asset)
{
assetsInCache++;
assetCacheMemoryUsage += asset.Data.Length;
}
public void AddTexture(AssetBase image)
{
texturesInCache++;
textureCacheMemoryUsage += image.Data.Length;
}
/// <summary>
/// Report back collected statistical information.
/// </summary>
/// <returns></returns>
public string Report()
{
return string.Format(
@"Asset cache contains {0,6} assets using {1,10:0.000}K
Texture cache contains {2,6} textures using {3,10:0.000}K",
AssetsInCache, AssetCacheMemoryUsage / 1024.0,
TexturesInCache, TextureCacheMemoryUsage / 1024.0);
}
}
}

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
namespace OpenSim.Framework.Statistics
{
/// <summary>
/// Singleton used to provide access to statistics reporters
/// </summary>
public class StatsManager
{
private static SimExtraStatsReporter simExtraStats;
public static SimExtraStatsReporter SimExtraStats { get { return simExtraStats; } }
private StatsManager()
{
}
/// <summary>
/// Start recording statistics. Should only be called once - calling again will reset statistic
/// counts.
/// </summary>
public static void StartCollecting()
{
simExtraStats = new SimExtraStatsReporter();
}
}
}

View File

@ -184,7 +184,7 @@ namespace OpenSim.Grid.AssetServer
break;
case "stats":
MainLog.Instance.Notice("STATS", Environment.NewLine + m_stats.Report());
m_console.Notice("STATS", Environment.NewLine + m_stats.Report());
break;
case "shutdown":

View File

@ -39,6 +39,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console;
using OpenSim.Framework.Servers;
using OpenSim.Framework.Statistics;
using OpenSim.Region.ClientStack;
using OpenSim.Region.Communications.Local;
using OpenSim.Region.Communications.OGS1;
@ -244,7 +245,7 @@ namespace OpenSim
if (m_storageDll == "OpenSim.DataStore.MonoSqlite.dll")
{
m_storageDll = "OpenSim.Framework.Data.SQLite.dll";
Console.WriteLine("WARNING: OpenSim.DataStore.MonoSqlite.dll is depreciated. Set storage_plugin to OpenSim.Framework.Data.SQLite.dll.");
Console.WriteLine("WARNING: OpenSim.DataStore.MonoSqlite.dll is deprecated. Set storage_plugin to OpenSim.Framework.Data.SQLite.dll.");
Thread.Sleep(3000);
}
m_storageConnectionString
@ -301,8 +302,10 @@ namespace OpenSim
// Create a log instance
m_log = CreateLog();
MainLog.Instance = m_log;
MainLog.Instance = m_log;
StatsManager.StartCollecting();
// Do baseclass startup sequence: OpenSim.Region.ClientStack.RegionApplicationBase.StartUp
// TerrainManager, StorageManager, HTTP Server
// This base will call abstract Initialize
@ -703,6 +706,7 @@ namespace OpenSim
m_log.Error("show uptime - show simulator startup and uptime.");
m_log.Error("show users - show info about connected users.");
m_log.Error("show modules - shows info aboutloaded modules.");
m_log.Error("stats - statistical information for this server not displayed in the client");
m_log.Error("shutdown - disconnect all clients and shutdown.");
m_log.Error("terrain help - show help for terrain commands.");
break;
@ -883,6 +887,19 @@ namespace OpenSim
m_sceneManager.CurrentOrFirstScene.ExportWorldMap("exportmap.jpg");
}
break;
case "stats":
if (StatsManager.SimExtraStats != null)
{
MainLog.Instance.Notice(
"STATS", Environment.NewLine + StatsManager.SimExtraStats.Report());
}
else
{
MainLog.Instance.Notice("STATS", "Extra statistics collection has not been enabled");
}
break;
default:
m_log.Error("Unknown command");

View File

@ -93,6 +93,7 @@
<ReferencePath>../../../bin/</ReferencePath>
<Reference name="System"/>
<Reference name="OpenSim.Framework"/>
<Files>
<Match pattern="*.cs" recurse="true"/>