我目前正在调查Redis,为了调整其功能,我们需要更改ThreadPool的设置,特别是最小数量的Worker / IOC线程。
我们在Azure Web角色中托管应用程序,以及在“工作者角色”中托管应用程序。
阅读asp.net的文档,我找到了web.config的processModel.miniothreads
元素,其中包含:
基于每个CPU配置进程使用的最小I / O线程数。另请参阅maxIoThreads。
从技术上讲,我把它读作每个处理器核心的线程数,如果我错了,请纠正我。
不幸的是,我们无法将此设置用于辅助角色,因为它不是使用ASP.NET托管的,因此Microsoft的文档说使用ThreadPool.SetMinThreads
。
我尝试过研究,如果这个设置是按CPU计算的(在一个过程中),但我一无所获 - 所有路径都引导我查看mscoree.lib
的来源,我甚至都不确定目前是可能的,至少没有挖掘几天。
反编译的代码是:
[System.Security.SecuritySafeCritical] // auto-generated
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
public static bool SetMinThreads(int workerThreads, int completionPortThreads)
{
return SetMinThreadsNative(workerThreads, completionPortThreads);
}
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern bool SetMinThreadsNative(int workerThreads, int completionPortThreads);
所以我的问题是,核心是ThreadPool.SetMinThreads
还是ThreadPool.SetMaxThreads
?
使用web.config中的processModel.miniothreads
设置和应用程序中的ThreadPool
设置之间是否有任何重大区别?
[更新]: 我找到了单声道实现的源代码: https://github.com/mono/mono/blob/7ebae4c7f57a6c1b4d0a38e69f270a016b6f3143/mono/metadata/threadpool-ms.c
MonoBoolean
ves_icall_System_Threading_ThreadPool_SetMinThreadsNative (gint32 worker_threads, gint32 completion_port_threads)
{
mono_lazy_initialize (&status, initialize);
if (worker_threads <= 0 || worker_threads > threadpool->limit_worker_max)
return FALSE;
if (completion_port_threads <= 0 || completion_port_threads > threadpool->limit_io_max)
return FALSE;
threadpool->limit_worker_min = worker_threads;
threadpool->limit_io_min = completion_port_threads;
return TRUE;
}
仅限地点限制和使用的核心数量是验证:
MonoBoolean
ves_icall_System_Threading_ThreadPool_SetMaxThreadsNative (gint32 worker_threads, gint32 completion_port_threads)
{
gint cpu_count = mono_cpu_count ();
mono_lazy_initialize (&status, initialize);
if (worker_threads < threadpool->limit_worker_min || worker_threads < cpu_count)
return FALSE;
if (completion_port_threads < threadpool->limit_io_min || completion_port_threads < cpu_count)
return FALSE;
threadpool->limit_worker_max = worker_threads;
threadpool->limit_io_max = completion_port_threads;
return TRUE;
}
并设置默认值:
threads_count = mono_cpu_count () * threads_per_cpu;
threadpool->limit_worker_min = threadpool->limit_io_min = threads_count;
因此对于单声道看起来像线程池只考虑核心数量来验证最大线程数:最大线程数不能少于核心数。
是否适用于.NET实现?有什么方法可以找到相关的来源吗?