* 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 commitsThreadPoolClientBranch
parent
881f295e70
commit
a4bf98f4ba
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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":
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -93,6 +93,7 @@
|
|||
|
||||
<ReferencePath>../../../bin/</ReferencePath>
|
||||
<Reference name="System"/>
|
||||
<Reference name="OpenSim.Framework"/>
|
||||
|
||||
<Files>
|
||||
<Match pattern="*.cs" recurse="true"/>
|
||||
|
|
Loading…
Reference in New Issue