ThreadPoolの挙動を制御してスレッドの枯渇を防ぐ方法について


解説

.NET ThreadPoolならびにHostingEnvironmentパラメータを調整することで、スレッドの枯渇とスロットリングを予防できる可能性があります。下記の解決策節で紹介されているサンプルのコードでは、次のことができることを示しています。

解決策

  1. ConfigureThreadPool.csファイルからのコード サンプルを使用して新しいクラスを作成します。
  2. 作成したクラスをアセンブリにビルドします。
  3. 作成したアセンブリをウェブサイトの\binフォルダーに配置します。
  4. 設定パッチ ファイル\App_Config\Include\zzzフォルダーに作成して、設定から作成したクラスを参照します。
    <?xml version="1.0"?>
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    	<sitecore>
    		<pipelines>
    			<initialize>
    				<!--
    				Thread pool limits should be configured in machine config, however an access to machine config is not provided in cloud.
    				Thereby API-based approach must be taken.
    				-->
    				<processor type="Sitecore.Support.Pipelines.Loader.ConfigureThreadPool, Sitecore.Support.210408" resolve="true">
    					<MaxConcurrentRequestsPerCPU>8</MaxConcurrentRequestsPerCPU>
    					<!-- <MaxWorkerThreadsPerCore>20</MaxWorkerThreadsPerCore> -->
    					<MinWorkerThreadsPerCore>15</MinWorkerThreadsPerCore>
    					<!-- <MaxCompletionPortThreadsPerCore>20</MaxCompletionPortThreadsPerCore> -->
    					<MinCompletionPortThreadsPerCore>10</MinCompletionPortThreadsPerCore>
    				</processor>
    				<processor type="Sitecore.Analytics.Pipelines.Loader.StartThreadPoolSizeMonitor, Sitecore.Analytics">
    					<patch:delete/>
    				</processor>
    			</initialize>
    		</pipelines>
    	</sitecore>
    </configuration>

    ※注: このパッチは、ワーカーおよびThreadPoolのIOCPスレッドの最大および最小制限を設定します。なお、このパッチの設定値は一例としてのみ提示されており、最終値は負荷テストの結果をみて各ソリューションごとにチューニングする必要があります。明示的にMaxWorkerThreadsPerCoreおよびMaxCompletionPortThreadsPerCoreパラメータの値を指定している場合、それらの値に特に注意を払って下さい。値が低すぎる場合、余分なCPUリソースがあるにも関わらず空きスレッドが枯渇する可能性があります。