* 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 System.Threading;
using libsecondlife; using libsecondlife;
using libsecondlife.Packets; using libsecondlife.Packets;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Framework.Statistics;
namespace OpenSim.Framework.Communications.Cache namespace OpenSim.Framework.Communications.Cache
{ {
@ -223,6 +225,10 @@ namespace OpenSim.Framework.Communications.Cache
{ {
TextureImage textur = new TextureImage(asset); TextureImage textur = new TextureImage(asset);
Textures.Add(textur.FullID, textur); Textures.Add(textur.FullID, textur);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddTexture(textur);
if (asset.Temporary) if (asset.Temporary)
{ {
result = "Added to cache"; result = "Added to cache";
@ -244,6 +250,10 @@ namespace OpenSim.Framework.Communications.Cache
{ {
AssetInfo assetInf = new AssetInfo(asset); AssetInfo assetInf = new AssetInfo(asset);
Assets.Add(assetInf.FullID, assetInf); Assets.Add(assetInf.FullID, assetInf);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddAsset(assetInf);
if (asset.Temporary) if (asset.Temporary)
{ {
result = "Added to cache"; result = "Added to cache";
@ -294,6 +304,10 @@ namespace OpenSim.Framework.Communications.Cache
if (!Textures.ContainsKey(image.FullID)) if (!Textures.ContainsKey(image.FullID))
{ {
Textures.Add(image.FullID, image); Textures.Add(image.FullID, image);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddTexture(image);
if (RequestedTextures.ContainsKey(image.FullID)) if (RequestedTextures.ContainsKey(image.FullID))
{ {
AssetRequest req = RequestedTextures[image.FullID]; AssetRequest req = RequestedTextures[image.FullID];
@ -312,6 +326,10 @@ namespace OpenSim.Framework.Communications.Cache
if (!Assets.ContainsKey(assetInf.FullID)) if (!Assets.ContainsKey(assetInf.FullID))
{ {
Assets.Add(assetInf.FullID, assetInf); Assets.Add(assetInf.FullID, assetInf);
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddAsset(assetInf);
if (RequestedAssets.ContainsKey(assetInf.FullID)) if (RequestedAssets.ContainsKey(assetInf.FullID))
{ {
AssetRequest req = RequestedAssets[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; break;
case "stats": case "stats":
MainLog.Instance.Notice("STATS", Environment.NewLine + m_stats.Report()); m_console.Notice("STATS", Environment.NewLine + m_stats.Report());
break; break;
case "shutdown": case "shutdown":

View File

@ -39,6 +39,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Framework.Servers; using OpenSim.Framework.Servers;
using OpenSim.Framework.Statistics;
using OpenSim.Region.ClientStack; using OpenSim.Region.ClientStack;
using OpenSim.Region.Communications.Local; using OpenSim.Region.Communications.Local;
using OpenSim.Region.Communications.OGS1; using OpenSim.Region.Communications.OGS1;
@ -244,7 +245,7 @@ namespace OpenSim
if (m_storageDll == "OpenSim.DataStore.MonoSqlite.dll") if (m_storageDll == "OpenSim.DataStore.MonoSqlite.dll")
{ {
m_storageDll = "OpenSim.Framework.Data.SQLite.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); Thread.Sleep(3000);
} }
m_storageConnectionString m_storageConnectionString
@ -303,6 +304,8 @@ namespace OpenSim
m_log = CreateLog(); m_log = CreateLog();
MainLog.Instance = m_log; MainLog.Instance = m_log;
StatsManager.StartCollecting();
// Do baseclass startup sequence: OpenSim.Region.ClientStack.RegionApplicationBase.StartUp // Do baseclass startup sequence: OpenSim.Region.ClientStack.RegionApplicationBase.StartUp
// TerrainManager, StorageManager, HTTP Server // TerrainManager, StorageManager, HTTP Server
// This base will call abstract Initialize // 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 uptime - show simulator startup and uptime.");
m_log.Error("show users - show info about connected users."); m_log.Error("show users - show info about connected users.");
m_log.Error("show modules - shows info aboutloaded modules."); 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("shutdown - disconnect all clients and shutdown.");
m_log.Error("terrain help - show help for terrain commands."); m_log.Error("terrain help - show help for terrain commands.");
break; break;
@ -884,6 +888,19 @@ namespace OpenSim
} }
break; 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: default:
m_log.Error("Unknown command"); m_log.Error("Unknown command");
break; break;

View File

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