ThreadPool.SetMinThreads和SetMaxThreads以及核心数

时间:2016-06-06 16:35:10

标签: c# multithreading threadpool

我目前正在调查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实现?有什么方法可以找到相关的来源吗?

0 个答案:

没有答案