gpt4 book ai didi

mysql - ServiceStack 注册 web 服务性能低下

转载 作者:行者123 更新时间:2023-11-28 23:12:12 25 4
gpt4 key购买 nike

我们注意到 Service Stack Web 服务中存在一些性能瓶颈,尤其是那些开箱即用的服务,例如(注册)Web 服务。

我们使用具有以下参数的 Visual Studio 负载测试运行负载测试:

  • 1K 并发用户。
  • 1 分钟时长。
  • 测试迭代之间有 5 秒的思考时间。
  • 5 秒采样率。

结果非常糟糕,以至于他们实际上阻止了我们与客户一起生活:

19 秒平均响应时间

环境规范是:

  • 2 个 Web 前端 (IIS) 使用 c4.8xlarge EC2 在 AWS 欧洲区域托管公开负载均衡器背后的实例(16GB-Ram 和 8vCPU)。
  • 在 (db.m4.4xlarge) EC2 中运行的 AWS RDS 中托管的 MySql 数据库实例(64GB 内存,高网络流量,16 个 vCPU)

我们没有特殊的代码或特殊的全局请求过滤器..只有默认配置..我们甚至尝试了连接池,但这并没有太大帮助..

如此缓慢的性能背后的原因是什么?感谢您的支持,因为我们正处在客户质疑 ServiceStack 框架本身的地步,我们也开始对此产生怀疑,尽管我们喜欢它的各个方面。

最佳答案

我们追根究底......经过数小时的调试和分析注册/登录网络服务后,我们发现注册代码对数据库执行重复查询(例如检查现有用户验证逻辑等)甚至被 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 以反射(reflect)这些,最后向新的数据库列添加索引并调整 ormlite where 条件以使用新列。

关于mysql - ServiceStack 注册 web 服务性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45485263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com