2011-09-29 52 views
3

我正在尋找一些我們遇到的生產問題的幫助。什麼導致了這種情況下的瓶頸?

我們有一個NServiceBus處理程序,它在處理消息時向IIS 6.0上運行的asmx(.net 2.0)Web服務發送請求,然後Web服務將第二個http請求平均發送到第三方Web服務第三方服務需要500毫秒才能響應,但我們被告知只有當11個同時請求正在進行時纔會啓動排隊請求。

爲了滿足我們處理SLA的需求,我們需要每小時處理79,000條消息或每分鐘處理約1300條消息。有11個請求並行處理,平均需要500毫秒,如果我們能夠獲得11個併發請求,每秒鐘我們應該能夠處理大約20條消息,這應該是可以實現的。

我們現在面臨的問題是,我們無法在這些數字附近找到任何地方。我們部署的解決方案如下。我們有一項服務,每5分鐘輪詢一個數據庫以檢索一批100條新消息,它將它們發送給一個經銷商,該經銷商負責在兩臺服務器上運行的四個工作者Windows服務間的負載平衡。我會給他們打電話NsbServerA & NSbServerB。每個輔助服務都配置了2個線程,所以我們總共有8個線程。我們有兩臺運行asmx Web服務的服務器,我將其稱爲asmx1 & asmx2,ServerA向asmx1發送請求,ServerB向asmx2發送請求。

當前的吞吐量是每小時30,000條消息,每分鐘約500個,每秒約8個,所以我們有一個瓶頸問題在哪裏?

我已經看到這篇文章http://support.microsoft.com/default.aspx?scid=kb;en-us;821268這似乎表明如果您想對同一個webservice進行多個併發調用,您必須調整IIS 6.0過程模型。從文章

報價: 「如果你正在一個Web服務調用從每個ASPX頁面一個IP地址,Microsoft建議您使用以下配置設置: 設置maxWorkerThreads參數的值和maxIoThreads參數到100 設置MAXCONNECTION參數的值,以12 * N(其中N是你有CPU的數量)。 設置minFreeThreads參數的值,以88 * N和minLocalRequestFreeThreads參數to76 * N。 將minWorkerThreads的值設置爲50.請記住,默認情況下minWorkerThreads不在配置文件中,您必須添加它。「

如果任何人都可以闡明發生了什麼或解決方案是什麼,我會非常感激。

感謝,

查理

+2

Downvoter,請與OP分享他需要糾正的內容,以避免downvote。 –

+0

您是否單獨測量每個組件的吞吐量?這可以使用每個組件的存根/模擬服務來完成。 – Oded

+2

我在任何地方都看不到編程問題。 – bmargulies

回答

2

一個可能的可能性:

的ServicePointManager,通過它你所有的.NET Web請求路由,具有每個對象的兩個併發連接的默認。見ServicePointManager.DefaultConnectionLimit

因此,如果您的第三方Web服務平均需要500毫秒的響應時間,則單個服務器每秒只能對該服務執行四次請求。 (即每500毫秒兩個併發請求)。

乘以兩臺服務器,你會得到每秒8條消息。

嘗試設置ServicePointManager.DefaultConnectionLimit = 4;當您啓動您的程序,並查看是否增加您的吞吐量。

+0

我會放棄並讓你知道 –

0

聽起來像它可能是很多事情。

  1. 您是否使用市售的標準版NServiceBus?沒有你的處理程序將工作單線程。
  2. 您的中檔Web服務是異步的嗎?如果第二次服務往返是同步進行的,則線程將被捆綁並且無法處理傳入的請求。
  3. 您是否配置了足夠的工作線程來處理傳入的請求? 更新:請參閱本頁http://msdn.microsoft.com/en-us/library/ff647787.aspx#scalenetchapt06_topic9(「表6.1:推薦用於減少爭用的線程設置」),以獲得高吞吐量建議。您應該查看的設置是minFreeThreads,maxconnection,maxWorkerThreads和minWorkerThreads。

如果你不能在沒有大規模優化的情況下無法可靠地達到這個目標,我會緊張地承諾每秒處理20條消息的吞吐量SLA。

也可能是一個愚蠢的問題,但爲什麼你不能直接從你的消息處理程序調用遠程服務?

+0

我們正在使用版本2。0,它早於具有單線程調節的商業版本。沒有中間層webservice不是異步的,所以這可能是問題,我可以部署這個服務的多個實例來查看吞吐量是否增加。如果事實證明是這個問題,你知道是否將它改爲異步可以解決問題? 3這個配置在哪裏? 不是一個愚蠢的問題,這可能會成爲最好的解決方案,但這意味着維護兩套代碼來完成同樣的事情,中間層服務被其他服務所使用,有些是第三方。 –

+0

我想我們也可以修改中間層web服務來簡單地創建NServiceBus消息並將其傳遞給NSB分發服務器進行處理。那麼我們只會有一段代碼要維護。我認爲NServiceBus網關可以用這種方式使用。 –

+0

請參閱更新到我原來的答案... –

0

我建議單獨測試系統的每一層。

具體而言,首先將數據庫層折扣爲一個問題。我會將一些簡單的集成式單元測試放在一起,這些測試可以執行數據庫的峯值吞吐量,理想情況下可以使用類似於Parallel.ForEach的東西同時運行幾百個線程。

然後向上移動一層並使用類似存根的東西來「模擬」數據庫調用並驗證服務層的行爲是否應該如此。

然後至少你將能夠縮小效率低下並處理它們。

相關問題