1

我們注意到服務堆棧Web服務中的一些性能瓶頸,特別是像(註冊)Web服務這樣的盒子。ServiceStack註冊Web服務性能下降

我們跑了使用Visual Studio負載測試具有以下參數的負載測試:

  • 1K併發用戶。
  • 持續1分鐘。
  • 測試迭代之間的5秒思考時間。
  • 5秒採樣率。

的結果是如此糟糕,他們實際上是阻止我們與客戶去住:

19秒平均響應時間

環境規格有:

  • 2在AWS Europe Region中使用c4.8xlarge EC2託管的Web前端(IIS)公開後面的實例(16GB-Ram & 8vCPU)包含負載平衡器。
  • MySQL數據庫在AWS RDS託管內運行(db.m4.4xlarge)EC2實例 (64GB內存,高網絡流量,16個vCPU)

我們沒有特殊的代碼或特殊全局請求過濾器..只有默認配置..我們甚至嘗試過連接池,但這並沒有太大的幫助..

這種性能下降的原因是什麼?感謝您的支持,因爲我們處於客戶對ServiceStack框架本身提出質疑的地步,即使我們熱愛它的每一個方面,我們也開始懷疑這一點。

+0

如果沒有一個可以看到的實際示例,您可能會遇到一些性能較差的代碼,不正確的API使用情況或您的環境中存在的其他問題,這些信息無濟於事,將帶有基準的獨立應用程序放在一起,問題,我們將看看, – mythz

+0

嗨@mythz ..我們的自定義Web服務並沒有受到影響,並提供了0.6 - 1.0秒的平均響應時間跨越1k併發調用..只有默認的'註冊'和'身份驗證'網站服務正在遭受..這些方法是否有任何基準?在編寫它們的實現時考慮了性能?我們懷疑Fluent Validator部件,但這只是在黑暗中拍攝..你可以幫忙嗎? –

+0

@MohammadZekrallah註冊服務需要執行驗證並在註冊的Auth提供程序中設置一個新用戶+調用多個會話/身份驗證回調。您可以檢查[RegisterService](https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/RegisterService.cs)的impl以查看它的作用,例如,如果您未指定' ?AutoLogin = true'會更快。如果你擔心perf,你應該考慮自定義RegisterService將用戶直接插入UserAuth表格,否則不要在黑暗中拍攝,請剖析應用程序以查看瓶頸的位置 – mythz

回答

1

我們回到了最底層。經過幾個小時的調試和分析註冊/登錄Web服務後,我們發現註冊代碼執行對db的重複查詢(比如檢查現有用戶驗證邏輯等)。甚至被Mini Profiler強調,但這仍然不是導致只有1K個併發用戶觸及服務的原因,與我們運行的環境規格相比,這是非常低的數量。

的原因是由於下面的代碼獲取調用兩個註冊/登錄:

private static TUserAuth GetUserAuthByUserName(IDbConnection db, string userNameOrEmail) 
{ 
    var isEmail = userNameOrEmail.Contains("@"); 

    var userAuth = isEmail 
     ? db.Select<TUserAuth>(q => q.Email.ToLower() == userNameOrEmail.ToLower()).FirstOrDefault() 
     : db.Select<TUserAuth>(q => q.UserName.ToLower() == userNameOrEmail.ToLower()).FirstOrDefault(); 

    return userAuth; 
} 

.ToLower()的調用被記到SQL較低函數獲取調用而當這是同時運行在一個表,你有成千上萬的行,這將導致數據庫服務器的巨大CPU峯值導致所有的瓶頸。

該修復非常簡單,只需在數據庫中添加專用的降級用戶名和電子郵件字段,更新UserAuth POCO以反映這些字段,最後將索引添加到新的數據庫列並調整ormlite使用新列的條件。