WCFの接続制限について
Fargate(Windowsサーバ+IIS)で稼働しているサーバーアプリが並列処理されずに困っております。 クライアントとサーバー間はWCF接続を行っており、おそらくこのWCFに関する設定が原因と考えており 調査を進めておりますが、いまだ対応方法が分かっていない状況です。 もし、WCF接続に関する課題や問題点等のナレッジをお持ちでしたらご教授頂きたくご連絡いたしました。 具体的な、環境や検証方法や、検証結果のエビデンスは添付ファイルをご参照いただけますでしょうか。 以下、概要になります。
- クライアントアプリは「.Net4.8 Formアプリ(vb.net)になります。
- データベースはAuroraPostgreSQLを使用しています。
- データベースへのアクセスは、サーバーアプリ側で行っており、クライアント側からデータアクセス要求をだすような仕組みです。
- クライアント/サーバー間の通信は、WCFを利用しており、通信経路はクライアントPC - WCF - ALB - Fargate - Auraora となっております。
- FargateはWindowsサーバー+IISで構成されており、IISよりWCFサービスへ制御が渡り、WCFサービスがサーバーアプリを呼出し、サーバーアプリがDBアクセスを行っています。
- 問題となっている部分は、クライアントPCより同時に30の処理要求をサーバーアプリへ出したときに、サーバー側のアプリが5つ程度しか同時に処理を行ってくれない点になります。
- ALB、IISのログは確認済みで、この部分で接続制限がかかっていることはありませんでした。
- WCFの設定(configファイル等)には、同時接続に関する設定がありますので、設定値を変えながらいくつものパターンを試しています。
- 結果、サーバーアプリへの30の処理要求に対して、サーバーアプリ側が2秒以内に全て処理が開始されたことが1回確認できましたが、明確な手順が確立されていません。(毎回処理結果が異なってしまうようなイメージです)
.NET
Visual Studio
Windows Server
-
Raina Zhao - MSFT 2,855 評価のポイント • Microsoft ベンダー
2024-02-05T09:13:29.88+00:00 林泰弘さん、こんにちは。フォーラムオペレーターのRainaです。
Microsoft Q&A フォーラムにご投稿くださいましてありがとうございます。ご説明いただいた内容により、WCF サービスのインスタンス管理モデルが単一ではないことを示しています。原因は送信されるリクエストのサイズがサーバーの制限を超えているかもしれません。この制限は
maxReceivedMessageSize
プロパティを使用して増やすことができます。maxReceivedMessageSize
の最大値は 65536です。BasicHttpBinding.MaxReceivedMessageSize プロパティをご参考まで。また、これもWCF同時接続制限に関連しているようです。具体的には、WCF サービス パフォーマンスを制御するための ServiceThrottlingBehavior の使用をご参照ください。
どうぞよろしくお願いします。
-
林泰弘 0 評価のポイント
2024-02-05T10:03:03.66+00:00 maxReceivedMessageSizeとServiceThrottlingBehaviorは調査しましたが、5しか同時接続できませんでした。 他の方法はありますでしょうか? 別途、システム構成、2枚目にConfigを添付しました。
-
林泰弘 0 評価のポイント
2024-02-05T10:04:00.1133333+00:00 一旦、こちらのコメントを以下のスレッドへ移動します。
サインインしてコメントする
-
林泰弘 0 評価のポイント
2024-02-05T09:42:40.5033333+00:00 -
林泰弘 0 評価のポイント
2024-02-05T09:53:06.5433333+00:00 PDFの1ページ目にシステム構成図と2ページ目にconfigを添付しました。 maxReceivedMessageSizeとServiceThrottlingBehaviorは、調査しましたが状況は変わりませんでした。 5つ同時は起動しますが、その後1秒経過後ずつしか起動しません。 最終的には300~500同時起動させたいです。 何か解決策はありますでしょうか?
-
Raina Zhao - MSFT 2,855 評価のポイント • Microsoft ベンダー
2024-02-06T09:45:10.0966667+00:00 林泰弘さん、こんにちは。フォーラムオペレーターのRainaです。
ご返信いただきありがとうございます。
添付の資料を確認した上で、配置には問題ないと思っています。 まずは以下の内容をご確認ください。
- サーバー側には500個のリクエストを同時にサポートできますでしょうか。
- クライアントはサーバーに接続する方式は何でしょうか。例えば、サービス参照。
- サービスコードは非同期かどうか。できれば、コードスニペットなどをご共有できれば幸いです。
どうぞよろしくお願いします。
-
林泰弘 0 評価のポイント
2024-02-06T10:51:21.5833333+00:00 Raina Zhao様 回答致します。
- サーバー側には500個のリクエストを同時にサポートできますでしょうか。 ⇒AWS FargeteでWindowsコンテナを立ち上げています。 立ち上げるコンテナ数に上限はありませんで、コンテナを500個立ち上げることは可能です。
- クライアントはサーバーに接続する方式は何でしょうか。 ⇒HttpsによるWCF通信です
- サービスコードは非同期かどうか。 ⇒クライアントとサーバーは同期していて、コールバックなどの非同期処理は行っておりません。 以下、サーバのコードです。 ■Service.svc(Service.svc.vb)<System.ServiceModel.ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple,InstanceContextMode:=InstanceContextMode.PerCall,UseSynchronizationContext:=False)> 以下、アプリの環境設定です。 ■FrmMenu.exe.config(app.config)
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.net> <connectionManagement> <add address = "*" maxconnection = "100"/> </connectionManagement> </system.net> <system.diagnostics> <sources> <source name="DefaultSource" switchName="DefaultSwitch"> <listeners> <add name="FileLog" /> </listeners> </source> </sources> <switches> <add name="DefaultSwitch" value="Information" /> </switches> <sharedListeners> <add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter" /> </sharedListeners> </system.diagnostics> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100" maxConcurrentInstances="100"/> </behavior> </serviceBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IService1" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" sendTimeout="00:10:00" receiveTimeout="00:10:00"> <security mode="Transport"> <transport clientCredentialType="None" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="https://gohantancs.jp/GTXWcfService/Service.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService" name="BasicHttpBinding_IService1" /> </client> </system.serviceModel> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
-
林泰弘 0 評価のポイント
2024-02-06T10:53:31.8566667+00:00 以下、Webの環境設定です。 ■web.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.net> <connectionManagement> <add address = "*" maxconnection = "100"/> </connectionManagement> </system.net> <system.serviceModel> <services> <service behaviorConfiguration="ServiceBehavior" name="GTXWcfService.Service"> <endpoint address="" binding="basicHttpBinding" contract="GTXWcfService.IService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100" maxConcurrentInstances="100"/> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" sendTimeout="00:10:00" receiveTimeout="00:10:00"> </binding> </basicHttpBinding> </bindings> </system.serviceModel> <system.web> <compilation debug="true" strict="false" explicit="true" targetFramework="4.8" /> <httpRuntime targetFramework="4.8" maxRequestLength="153600" executionTimeout="600" /> <customErrors mode="Off" /> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
-
Raina Zhao - MSFT 2,855 評価のポイント • Microsoft ベンダー
2024-02-07T09:44:01.01+00:00 林泰弘さん、ご返信いただきありがとうございます。
プロジェクトにサービスとクライアントは常に接続を維持する必要がありますか。
サーバー側の構成コードを見ると、InstanceContextMode:=InstanceContextMode.PerCall
を使用しているのですが、これは毎回初期化にされ、多くのリソースを消費します。
InstanceContextMode:=InstanceContextMode.PerSession
を試してみればいかがでしょうか。
これは毎回に初期化にされてなく、多くのリソースを節約できます。ただし、長期間接続を維持するようなプロジェクトに適しています。 -
林泰弘 0 評価のポイント
2024-02-08T11:41:29.16+00:00 Raina Zhao様 回答ありがとうございます。 InstanceContextMode:=InstanceContextMode.PerSessionを試しましたが 状況は変わりませんでした。 他に何か方法がありましたら、ご教授お願いいたします。
-
Raina Zhao - MSFT 2,855 評価のポイント • Microsoft ベンダー
2024-02-13T01:55:35+00:00 林泰弘さん、ご返信いただきありがとうございます。
やはり構成には問題なく、サービスコードの問題だと思いますが、基本的なサービスを実行し、この構成で期待通りかどうかを確認してください。 -
林泰弘 0 評価のポイント
2024-02-15T09:06:07.3133333+00:00 Raina Zhao様 これまでご回答いただいた内容で設定の見直しを行ってみましたが、解決に至っておりません。 ログ出力を追加し、インスタンス状態を確認してみました。 これまでの検証内容をPDF6ファイルにまとめました。 こちらの6ファイルを参照して頂き、何か解決策がありましたら、ご教授お願い致します。 マイクロソフト様お問い合わせ資料_0215_1.pdf
-
林泰弘 0 評価のポイント
2024-02-15T09:06:32.9233333+00:00 -
林泰弘 0 評価のポイント
2024-02-15T09:08:38.17+00:00 -
林泰弘 0 評価のポイント
2024-02-15T09:14:42.8+00:00 -
林泰弘 0 評価のポイント
2024-02-15T09:15:06.19+00:00 -
林泰弘 0 評価のポイント
2024-02-15T09:16:06.1233333+00:00 マイクロソフト様お問い合わせ資料_0215_6.pdf 以上、6ファイルのご確認お願いいたします。
-
Raina Zhao - MSFT 2,855 評価のポイント • Microsoft ベンダー
2024-02-21T10:07:51.8066667+00:00 -
林泰弘 0 評価のポイント
2024-02-22T12:22:55.38+00:00 Raina Zhao様 返答ありがとうございます。 再現可能なコードサンプルとして、ミニマムシステムを作成するには時間を要してしまいます。関連ソースの一部を資料の中に記載しています。 以下6ファイルを添付します。 資料を参照頂き、「最小限の再現できるコードサンプル」が必要との事でしたら、再度返答お願いします。
マイクロソフト様お問い合わせ資料_0221_04_001.pdfマイクロソフト様お問い合わせ資料_0221_04_002.pdfマイクロソフト様お問い合わせ資料_0221_04_003.pdf マイクロソフト様お問い合わせ資料_0221_04_004.pdf マイクロソフト様お問い合わせ資料_0221_04_005.pdf マイクロソフト様お問い合わせ資料_0221_04_006.pdf
サインインしてコメントする -