* 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 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];
|
||||||
|
|
|
@ -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;
|
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":
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"/>
|
||||||
|
|
Loading…
Reference in New Issue