Additional ThreadPool worker and IOCP thread startup logic
Signed-off-by: BlueWall <jamesh@bluewallgroup.com>user_profiles
parent
adedd70c35
commit
7524bd5a7c
|
@ -102,16 +102,49 @@ namespace OpenSim
|
|||
m_log.InfoFormat(
|
||||
"[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset");
|
||||
|
||||
// Increase the number of IOCP threads available. Mono defaults to a tragically low number
|
||||
// Verify the Threadpool allocates or uses enough worker and IO completion threads
|
||||
// .NET 2.0 workerthreads default to 50 * numcores
|
||||
// .NET 3.0 workerthreads defaults to 250 * numcores
|
||||
// .NET 4.0 workerthreads are dynamic based on bitness and OS resources
|
||||
// Max IO Completion threads are 1000 on all 3 CLRs.
|
||||
int workerThreadsMin = 500;
|
||||
int workerThreadsMax = 1000; // may need further adjustment to match other CLR
|
||||
int iocpThreadsMin = 1000;
|
||||
int iocpThreadsMax = 2000; // may need further adjustment to match other CLR
|
||||
int workerThreads, 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);
|
||||
if (workerThreads < 500 || iocpThreads < 1000)
|
||||
if (workerThreads < workerThreadsMin)
|
||||
{
|
||||
workerThreads = 500;
|
||||
iocpThreads = 1000;
|
||||
m_log.Info("[OPENSIM MAIN]: Bumping up to 500 worker threads and 1000 IOCP threads");
|
||||
System.Threading.ThreadPool.SetMaxThreads(workerThreads, iocpThreads);
|
||||
workerThreads = workerThreadsMin;
|
||||
m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to worker threads to {0}",workerThreads);
|
||||
}
|
||||
if (workerThreads > workerThreadsMax)
|
||||
{
|
||||
workerThreads = workerThreadsMax;
|
||||
m_log.InfoFormat("[OPENSIM MAIN]: Limiting worker threads to {0}",workerThreads);
|
||||
}
|
||||
// Increase the number of IOCP threads available.
|
||||
// Mono defaults to a tragically low number (24 on 6-core / 8GB Fedora 17)
|
||||
if (iocpThreads < iocpThreadsMin)
|
||||
{
|
||||
iocpThreads = iocpThreadsMin;
|
||||
m_log.InfoFormat("[OPENSIM MAIN]: Bumping up IO completion threads to {0}",iocpThreads);
|
||||
}
|
||||
// Make sure we don't overallocate IOCP threads and thrash system resources
|
||||
if ( iocpThreads > iocpThreadsMax )
|
||||
{
|
||||
iocpThreads = iocpThreadsMax;
|
||||
m_log.InfoFormat("[OPENSIM MAIN]: Limiting IO completion threads to {0}",iocpThreads);
|
||||
}
|
||||
// set the resulting worker and IO completion thread counts back to ThreadPool
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Info("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect.");
|
||||
}
|
||||
|
||||
// Check if the system is compatible with OpenSimulator.
|
||||
|
|
Loading…
Reference in New Issue