Improve threadpool reporting to "show threads" console command (also gets printed out periodically)
parent
20b0fda3bb
commit
4803686078
|
@ -272,12 +272,8 @@ namespace OpenSim.Framework.Servers
|
||||||
sb.Append(Environment.NewLine);
|
sb.Append(Environment.NewLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
int workers = 0, ports = 0, maxWorkers = 0, maxPorts = 0;
|
sb.Append("\n*** Main threadpool (excluding script engine)***\n");
|
||||||
ThreadPool.GetAvailableThreads(out workers, out ports);
|
sb.Append(Util.GetThreadPoolReport());
|
||||||
ThreadPool.GetMaxThreads(out maxWorkers, out maxPorts);
|
|
||||||
|
|
||||||
sb.Append(Environment.NewLine + "*** ThreadPool threads ***" + Environment.NewLine);
|
|
||||||
sb.Append("workers: " + (maxWorkers - workers) + " (" + maxWorkers + "); ports: " + (maxPorts - ports) + " (" + maxPorts + ")" + Environment.NewLine);
|
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,6 @@ namespace OpenSim.Framework
|
||||||
return lerp(y, lerp(x, a, b), lerp(x, c, d));
|
return lerp(y, lerp(x, a, b), lerp(x, c, d));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Encoding UTF8 = Encoding.UTF8;
|
public static Encoding UTF8 = Encoding.UTF8;
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
|
@ -1674,6 +1673,61 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a thread pool report.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetThreadPoolReport()
|
||||||
|
{
|
||||||
|
string threadPoolUsed = null;
|
||||||
|
int maxThreads = 0;
|
||||||
|
int minThreads = 0;
|
||||||
|
int allocatedThreads = 0;
|
||||||
|
int inUseThreads = 0;
|
||||||
|
int waitingCallbacks = 0;
|
||||||
|
int completionPortThreads = 0;
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool)
|
||||||
|
{
|
||||||
|
threadPoolUsed = "SmartThreadPool";
|
||||||
|
maxThreads = m_ThreadPool.MaxThreads;
|
||||||
|
minThreads = m_ThreadPool.MinThreads;
|
||||||
|
inUseThreads = m_ThreadPool.InUseThreads;
|
||||||
|
allocatedThreads = m_ThreadPool.ActiveThreads;
|
||||||
|
waitingCallbacks = m_ThreadPool.WaitingCallbacks;
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem
|
||||||
|
|| FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem)
|
||||||
|
{
|
||||||
|
threadPoolUsed = "BuiltInThreadPool";
|
||||||
|
ThreadPool.GetMaxThreads(out maxThreads, out completionPortThreads);
|
||||||
|
ThreadPool.GetMinThreads(out minThreads, out completionPortThreads);
|
||||||
|
int availableThreads;
|
||||||
|
ThreadPool.GetAvailableThreads(out availableThreads, out completionPortThreads);
|
||||||
|
inUseThreads = maxThreads - availableThreads;
|
||||||
|
allocatedThreads = -1;
|
||||||
|
waitingCallbacks = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (threadPoolUsed != null)
|
||||||
|
{
|
||||||
|
sb.AppendFormat("Thread pool used : {0}\n", threadPoolUsed);
|
||||||
|
sb.AppendFormat("Max threads : {0}\n", maxThreads);
|
||||||
|
sb.AppendFormat("Min threads : {0}\n", minThreads);
|
||||||
|
sb.AppendFormat("Allocated threads : {0}\n", allocatedThreads < 0 ? "not applicable" : allocatedThreads.ToString());
|
||||||
|
sb.AppendFormat("In use threads : {0}\n", inUseThreads);
|
||||||
|
sb.AppendFormat("Work items waiting : {0}\n", waitingCallbacks < 0 ? "not available" : waitingCallbacks.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.AppendFormat("Thread pool not used\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
private static object SmartThreadPoolCallback(object o)
|
private static object SmartThreadPoolCallback(object o)
|
||||||
{
|
{
|
||||||
object[] array = (object[])o;
|
object[] array = (object[])o;
|
||||||
|
|
Loading…
Reference in New Issue