At OpenSimulator startup, print out default min built-in threadpool threads as well as max.

Make it clear that we only try to adjust max, and log at warn level if this fails.
Other minor logging cleanup.
TeleportWork
Justin Clark-Casey (justincc) 2013-08-05 20:47:47 +01:00
parent 151a8ca0cc
commit b8612e005a
1 changed files with 27 additions and 14 deletions

View File

@ -103,26 +103,38 @@ namespace OpenSim
"[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset"); "[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset");
// Verify the Threadpool allocates or uses enough worker and IO completion threads // Verify the Threadpool allocates or uses enough worker and IO completion threads
// .NET 2.0 workerthreads default to 50 * numcores // .NET 2.0, workerthreads default to 50 * numcores
// .NET 3.0 workerthreads defaults to 250 * numcores // .NET 3.0, workerthreads defaults to 250 * numcores
// .NET 4.0 workerthreads are dynamic based on bitness and OS resources // .NET 4.0, workerthreads are dynamic based on bitness and OS resources
// Max IO Completion threads are 1000 on all 3 CLRs. // Max IO Completion threads are 1000 on all 3 CLRs
//
// Mono 2.10.9 to at least Mono 3.1, workerthreads default to 100 * numcores, iocp threads to 4 * numcores
int workerThreadsMin = 500; int workerThreadsMin = 500;
int workerThreadsMax = 1000; // may need further adjustment to match other CLR int workerThreadsMax = 1000; // may need further adjustment to match other CLR
int iocpThreadsMin = 1000; int iocpThreadsMin = 1000;
int iocpThreadsMax = 2000; // may need further adjustment to match other CLR int iocpThreadsMax = 2000; // may need further adjustment to match other CLR
{
int currentMinWorkerThreads, currentMinIocpThreads;
System.Threading.ThreadPool.GetMinThreads(out currentMinWorkerThreads, out currentMinIocpThreads);
m_log.InfoFormat(
"[OPENSIM MAIN]: Runtime gave us {0} min worker threads and {1} min IOCP threads",
currentMinWorkerThreads, currentMinIocpThreads);
}
int workerThreads, iocpThreads; int workerThreads, iocpThreads;
System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads); System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
m_log.InfoFormat("[OPENSIM MAIN]: Runtime gave us {0} worker threads and {1} IOCP threads", workerThreads, iocpThreads); m_log.InfoFormat("[OPENSIM MAIN]: Runtime gave us {0} max worker threads and {1} max IOCP threads", workerThreads, iocpThreads);
if (workerThreads < workerThreadsMin) if (workerThreads < workerThreadsMin)
{ {
workerThreads = workerThreadsMin; workerThreads = workerThreadsMin;
m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to worker threads to {0}",workerThreads); m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to max worker threads to {0}",workerThreads);
} }
if (workerThreads > workerThreadsMax) if (workerThreads > workerThreadsMax)
{ {
workerThreads = workerThreadsMax; workerThreads = workerThreadsMax;
m_log.InfoFormat("[OPENSIM MAIN]: Limiting worker threads to {0}",workerThreads); m_log.InfoFormat("[OPENSIM MAIN]: Limiting max worker threads to {0}",workerThreads);
} }
// Increase the number of IOCP threads available. // Increase the number of IOCP threads available.
@ -130,22 +142,24 @@ namespace OpenSim
if (iocpThreads < iocpThreadsMin) if (iocpThreads < iocpThreadsMin)
{ {
iocpThreads = iocpThreadsMin; iocpThreads = iocpThreadsMin;
m_log.InfoFormat("[OPENSIM MAIN]: Bumping up IO completion threads to {0}",iocpThreads); m_log.InfoFormat("[OPENSIM MAIN]: Bumping up max IO completion threads to {0}",iocpThreads);
} }
// Make sure we don't overallocate IOCP threads and thrash system resources // Make sure we don't overallocate IOCP threads and thrash system resources
if ( iocpThreads > iocpThreadsMax ) if ( iocpThreads > iocpThreadsMax )
{ {
iocpThreads = iocpThreadsMax; iocpThreads = iocpThreadsMax;
m_log.InfoFormat("[OPENSIM MAIN]: Limiting IO completion threads to {0}",iocpThreads); m_log.InfoFormat("[OPENSIM MAIN]: Limiting max IO completion threads to {0}",iocpThreads);
} }
// set the resulting worker and IO completion thread counts back to ThreadPool // set the resulting worker and IO completion thread counts back to ThreadPool
if ( System.Threading.ThreadPool.SetMaxThreads(workerThreads, iocpThreads) ) if ( System.Threading.ThreadPool.SetMaxThreads(workerThreads, iocpThreads) )
{ {
m_log.InfoFormat("[OPENSIM MAIN]: Threadpool set to {0} worker threads and {1} IO completion threads", workerThreads, iocpThreads); m_log.InfoFormat(
"[OPENSIM MAIN]: Threadpool set to {0} max worker threads and {1} max IO completion threads",
workerThreads, iocpThreads);
} }
else else
{ {
m_log.Info("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect."); m_log.Warn("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect.");
} }
// Check if the system is compatible with OpenSimulator. // Check if the system is compatible with OpenSimulator.
@ -153,17 +167,16 @@ namespace OpenSim
string supported = String.Empty; string supported = String.Empty;
if (Util.IsEnvironmentSupported(ref supported)) if (Util.IsEnvironmentSupported(ref supported))
{ {
m_log.Info("Environment is compatible.\n"); m_log.Info("[OPENSIM MAIN]: Environment is supported by OpenSimulator.");
} }
else else
{ {
m_log.Warn("Environment is unsupported (" + supported + ")\n"); m_log.Warn("[OPENSIM MAIN]: Environment is not supported by OpenSimulator (" + supported + ")\n");
} }
// Configure nIni aliases and localles // Configure nIni aliases and localles
Culture.SetCurrentCulture(); Culture.SetCurrentCulture();
// Validate that the user has the most basic configuration done // Validate that the user has the most basic configuration done
// If not, offer to do the most basic configuration for them warning them along the way of the importance of // If not, offer to do the most basic configuration for them warning them along the way of the importance of
// reading these files. // reading these files.