爭用、 性能下降和死鎖進行 Web 服務請求 ASP.NET 應用程序優化

 原文鏈接:http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B821268
注意:這篇文章是由無人工介入的自動的機器翻譯系統翻譯完成。這些文章是微軟爲不懂英語的用戶提供的, 以使他們能夠理解這些文章的內容。微軟不保證機器翻譯的正確度,也不對由於內容的誤譯或者客戶對它的使用所引起的任何直接的, 或間接的可能的問題負責。
文章編號 : 821268
最後修改 : 2005年8月29日
修訂 : 6.0
<script type="text/javascript"> var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'"; var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif"; var depthLimit = 10; var depth3Limit = 10; var depth4Limit = 5; var depth5Limit = 3; var tocEntryMinimum = 1; </script> <script src="/common/script/gsfx/kbtoc.js??4" type="text/javascript"></script>

症狀

<script type="text/javascript">loadTOCNode(1, 'symptoms');</script>
進行從 ASP.NET 應用程序, 調用 XMLWeb 服務時可能會遇到爭用、 性能下降和死鎖。 客戶可能報告請求停止響應 (或 " 掛起 ") 或需要很長時間來執行。 如果懷疑死, 可能回收輔助進程。 應用程序事件日誌中可能會收到以下消息。
如果您使用 MicrosoftInternet 信息服務 (IIS) 5.0, 會應用程序事件日誌中您收到以下消息:

 

   Event Type:     Error
   Event Source:   ASP.NET 1.0.3705.0
   Event Category: None
   Event ID:       1003
   Date:           5/4/2003
   Time:           6:18:23 PM
   User:           N/A
   Computer:       <ComputerName>
   Description:
      aspnet_wp.exe  (PID: <xxx>) was recycled because it was suspected to be in a deadlocked state.
      It did not send any responses for pending requests in the last 180 seconds.

 

如果您使用 IIS 6.0, 會應用程序事件日誌中您收到以下消息:

 

   Event Type:     Warning
   Event Source:   W3SVC-WP
   Event Category: None
   Event ID:       2262
   Date:           5/4/2003
   Time:           1:02:33 PM
   User:           N/A
   Computer:       <ComputerName>
   Description:
      ISAPI 'C:/Windows/Microsoft.net/Framework/v.1.1.4322/aspnet_isapi.dll' reported itself as
      unhealthy for the following reason: 'Deadlock detected'.

 

如果您使用 IIS 6.0, 會系統事件日誌中您收到以下消息:

 

   Event Type:     Warning
   Event Source:   W3SVC
   Event Category: None
   Event ID:       1013
   Date:           5/4/2003
   Time:           1:03:47 PM
   User:           N/A
   Computer:       <ComputerName>
   Description:
      A process serving application pool 'DefaultAppPool' exceeded time limits during shut down.
      The process id was '<xxxx>'.

 

可能會進行對 HttpWebRequest.GetResponse 方法調用時還收到以下異常錯誤信息:
ôSystem.InvalidOperationException 有是沒有足夠的空閒線程 ThreadPool 對象以完成 operation.ö 中:
還可能在瀏覽器收到以下異常錯誤信息:
請求定時 out.ö ôHttpException (0 x 80004005):
注意 本文還適用於應用程序直接使 HttpWebRequest 請求。

原因

<script type="text/javascript">loadTOCNode(1, 'cause');</script>
因爲 ASP.NET 的輔助線程和完成端口線程, 調用可用於執行請求數限制可能發生此問題。

對 Web 服務調用通常, 使用一個輔助線程來執行代碼發送請求和一個完成端口線程以從 Web 服務接收回調。 但是, 如果請求重定向或需要驗證, 調用可能使用多達兩輔助和兩完成端口線程。 同時發生多個 Web 服務調用時, 因此您可消耗託管 ThreadPool。

例如, 假設 ThreadPool 僅限於 maxworkerthreads, 10, 並且當前執行所有 10 工作線程正在等待回調來執行代碼。 由於工作項排隊以 ThreadPool 阻塞線程可用之前可從不執行回調。

其他潛在源爭奪是 maxconnection 參數, System.Net 命名空間用於限制的連接數。 此限制通常, 按預期工作。 但是, 如果許多應用程序嘗試使許多請求到單個 IP 地址同時, 線程可能需要等待一個可用連接。

解決方案

<script type="text/javascript">loadTOCNode(1, 'resolution');</script>
Machine.config 文件以最適合您情況中要解決這些問題, 可調整以下參數:
maxWorkerThreads
minWorkerThreads
maxIoThreads
minFreeThreads
minLocalRequestFreeThreads
maxconnection
executionTimeout
要成功解決這些問題, 請按照下列步驟操作:
限制同時到大約 12 每 CPU 執行, ASP.NET 請求的數量。
允許 Web 服務回調用於 ThreadPool 中自由線程。
選擇一個適當值對於 maxconnections 參數。 根據您選擇的 IP 地址和 AppDomains 使用數。
注意 : 建議來限制每 CPU 12 ASP.NET 請求的數量是有點任意。 但是, 此限制已證明能夠適合大多數應用程序。

maxWorkerThreads maxIoThreads

<script type="text/javascript">loadTOCNode(2, 'resolution');</script> ASP.NET 使用以下兩配置設置來限制輔助線程和完成線程所使用的最大數量:
<processModel maxWorkerThreads="20" maxIoThreads="20">
maxWorkerThreads 參數和 maxIoThreads 參數是可隱式乘以的 CPU 數。 例如, 如果有兩個處理器, 的工作線程數是:
2 * maxWorkerThreads

minFreeThreads minLocalRequestFreeThreads

<script type="text/javascript">loadTOCNode(2, 'resolution');</script> ASP.NET 還包含以下配置設置決定多少輔助線程和完成端口線程必須可用於啓動遠程請求或本地請求:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
如果還有, 不夠線程請求是排隊直到足夠線程可以自由地發出請求。 ASP.NET, 因此不在同一時間執行超過下列數量的請求:
(* minFreeThreads maxWorkerThreads ) - 的 CPU 數
注意 minFreeThreads 參數和 minLocalRequestFreeThreads 參數是不隱性乘以的 CPU 數。

minWorkerThreads

<script type="text/javascript">loadTOCNode(2, 'resolution');</script> 存爲 ASP.NET 1.0 Service Pack 3 以及 ASP.NET 1.1, ASP.NET 還包含以下配置設置決定了多少工作線程可能可立即向遠程請求服務。
<processModel minWorkerThreads="1">
以多快速度比從 CLR 默認優化 " 線程 " 功能創建輔助線程創建由該設置控制線程。 此設置允許 ASP.NET 對服務請求, 可能是突然填充 ASP.NET 請求隊列由於以 slow-down 在後端服務器, 突然暴發來自客戶端, 或類似的請求會導致突然高度以多種請求隊列中。 對於 minWorkerThreads 參數默認值爲 1。 我們建議, 您將 < minWorkerThreads 參數值設置爲以下值。
minWorkerThreads = maxWorkerThreads / 2
默認情況下, minWorkerThreads 參數是 Web.config 文件或 Machine.config 文件中不存在。 此設置隱性乘以的 CPU 數。

maxconnection

<script type="text/javascript">loadTOCNode(2, 'resolution');</script> maxconnection 參數確定如何多連接可對特定 IP 地址。 參數顯示如下:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="65.53.32.230" maxconnection="12">
</connectionManagement>
對於本文中前面討論參數設置爲所有在進程級。 但是, maxconnection 參數設置適用於 AppDomain 級別。 默認, 因爲此設置適用於 AppDomain 級別, 最多兩個連接創建到特定 IP 地址從每個 AppDomain 過程中您。

executionTimeout

<script type="text/javascript">loadTOCNode(2, 'resolution');</script> ASP.NET 使用以下配置設置來限制請求執行時間:
<httpRuntime executionTimeout="90"/>
也可以通過 Server.ScriptTimeout 屬性設置此限制。

注意 如果您增加 executionTimeout 參數, 值可能還需要修改 processModel responseDeadlockInterval 參數設置。

建議

<script type="text/javascript">loadTOCNode(2, 'resolution');</script> 本節中推薦設置對所有應用程序可能無法工作。 但是, 以下附加信息可以幫助您進行適當調整。

如果進行一個 Web 服務調用到單個 IP 地址從每個 ASPX 頁面, Microsoft 建議您使用下列配置設置:
設置到 100 maxWorkerThreads 參數和 maxIoThreads 參數的值。
設置到 12 maxconnection 參數的值 * N N (其中 N 是的, 您有 CPU 數)。
minFreeThreads 參數的值設置爲 88 * N N minLocalRequestFreeThreads 參數來 76 N N *。
設置到 50 minWorkerThreads 的值。 請記住, minWorkerThreads 處於默認配置文件。 必須添加它。
一部分這些建議涉及簡單公式涉及在服務器上的 CPU 數。 變量, 表示公式中的 CPU 數是 N 。 有關這些設置, 如果有 hyperthreading 啓用, 必須使用的邏輯 CPU 數的物理 CPU 的數量而 例如, 如果與啓用, hyperthreading 有四個處理器服務器值 N 公式中將是 8 代替 4

注意使用此配置時, 因爲您可以同時執行最多 12 ASP.NET 請求每 CPU = 12 100 - 88。 因此, 至少 88 N 輔助線程和 88 N 完成端口線程可對其他使用 (例如用於 Web 服務回調) * *。

例如, 有服務器與四處理器和 hyperthreading 啓用。 對於本文中提及配置設置基於這些公式, 將使用下列值。
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50">
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"> 
<connectionManagement>
	<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>

還, 使用此配置, 時 12 連接可用每個 CPU 按 IP 地址對於每個 AppDomain。 因此, 在下列情況下, 幾乎爭奪當請求正在等待連接, 並且不耗盡 ThreadPool:
Web 承載一個應用程序 (AppDomain)。
每對 ASPX 頁面請求發出一個 Web 服務請求。
所有請求是到同一 IP 地址。
方案涉及下列之一但是, 當您使用此配置, 將可能使用太多連接:
請求是到多個 IP 地址。
請求是定向 (302 狀態代碼)。
請求需要身份驗證。
從多 AppDomains 進行請求。
在這些方案, 最好對 maxconnection 參數和高值 minFreeThreads 參數和 minLocalRequestFreeThreads 參數可以使用較低值。

狀態

<script type="text/javascript">loadTOCNode(1, 'status');</script>
此行爲是設計使然。

參考

<script type="text/javascript">loadTOCNode(1, 'references');</script>
有關詳細信息, 請訪問 Microsoft Developer Network (MSDN) Web 站點:
http://msdn.microsoft.com/library/en-us/dnpag/html/scalenetchapt06.asp (http://msdn.microsoft.com/library/en-us/dnpag/html/scalenetchapt06.asp)

這篇文章中的信息適用於:
Microsoft ASP.NET 1.1
Microsoft ASP.NET 1.0
關鍵字: 
kbprb KB821268 KbMtzh kbmt
Microsoft和/或其各供應商對於爲任何目的而在本服務器上發佈的文件及有關圖形所含信息的適用性,不作任何聲明。 所有該等文件及有關圖形均"依樣"提供,而不帶任何性質的保證。Microsoft和/或其各供應商特此聲明,對所有與該等信息有關的保證和條件不負任何責任,該等保證和條件包括關於適銷性、符合特定用途、所有權和非侵權的所有默示保證和條件。在任何情況下,在由於使用或運行本服務器上的信息所引起的或與該等使用或運行有關的訴訟中,Microsoft和/或其各供應商就因喪失使用、數據或利潤所導致的任何特別的、
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章