【问题标题】:Entity framework core stress testing is slow实体框架核心压测速度慢
【发布时间】:2019-02-27 04:57:46
【问题描述】:
  • 我用 EF 内核构建了一个 .net core 2.1 应用程序。

  • 我使用了带有未提交读取隔离级别的事务。

  • 我构建了异步 API 并创建了一个简单的 ef 查询异步(获取第一个用户的 5 个字段,而不是引用其他表)。 [查询用户][1]

  • 当我创建一个请求时,查询需要很短的时间

  • 当我用 10 个线程进行压力测试时,ramp-up:5,永远循环(使用 jmeter),查询时间是相同的

  • 但是,当我使用 jmeter 对 api 进行压力测试时(100 个线程,加速:20s,永远循环),一些查询需要很短的时间,一些查询需要很长时间(可能是 5s、10s、25s ...) ,另一个查询抛出连接超时异常

  • 我该怎么办?

问题已解决:需要几天时间进行调查,我尝试使用此解决方案,它运行良好。所以,我将在这篇文章中分享它,如果您有其他提高性能的解决方案,请告诉我。

  • 创建数据库连接是一个耗费时间的昂贵过程。您可以指定要在应用程序的生命周期内创建并保持打开的最小连接池。然后将这些用于每个数据库调用。

  • 应该使用事务隔离级别“Read Uncommitted”

  • 应该对一个请求的多个操作使用相同的数据库连接

  • 所有的API,方法都应该是Async方法,注意不要把Async和Sync混在一起。

    谢谢大家!!!

【问题讨论】:

  • 对答案有任何反馈吗?如果可以,它应该被接受和投票,以便对社区有所帮助。谢谢

标签: multithreading asp.net-core jmeter stress-testing entity-framework-core-2.1


【解决方案1】:

首先使用 JMeter,在非 GUI 模式下运行测试,以确保没有错误结果并遵循最佳实践,请参阅:

一旦您确认问题是真实的,请检查多项内容:

  • 没有 N+1 选择问题(查询循环)
  • 检索数据的粒度,您检索的数据是否过多
  • 通过查看 DB 发出的 SQL 查询的性能?
  • 池大小

查看一些有趣的博客:

【讨论】:

  • 我用照片更新了问题,请查看照片#query 用户。我将连接字符串中的最大池大小设置为 5000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2017-04-03
  • 2020-05-10
  • 2020-09-12
相关资源
最近更新 更多