いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

複数のCPUグループがある場合に全CPUグループに対してマネージスレッドを分散する (Thread_UseAllCpuGroup,GCCpuGroup,gcServer, NUMA)

忘れない内にメモメモ。

サーバーなどで複数のCPUグループを持つコンピュータがあった場合、CLRはデフォルトで最初のCPUグループしか使ってくれません。

なので、例えばCPUグループが2つあり、それぞれ20コアずつ存在する場合、普通にタスクで処理すると40コアあるのに20コアしか使ってくれません。

それを全CPUグループ有効にするには、App.Configに以下の設定を加える必要があります。

    <runtime>
        <Thread_UseAllCpuGroups enabled="true"></Thread_UseAllCpuGroups>
        <GCCpuGroup enabled="true"></GCCpuGroup>
        <gcServer enabled="true"></gcServer>
    </runtime>

上記設定を入れると、全CPUグループに対してマネージスレッドが分散されます。ハマりました・・・・。

注意点として、上の設定は3つでセットです。Thread_UseAllCpuGroupsをTrueにする場合、GCCpuGroupもgcServerも共にTrueにする必要があります。

以下、参考にしたリソースです。

How to Get Started with Multi-Core: Parallel Processing You Can Use - US ISV Evangelism - Site Home - MSDN Blogs

stackoverflow.com

stackoverflow.com

<Thread_UseAllCpuGroups> 要素

<GCCpuGroup> 要素

<gcServer> 要素


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。