Aspnet 样板/Aspnet 零慢 (IoC)
Aspnet Boilerplate / Aspnet Zero slow (IoC)
我将 aspnetboilerplate/aspnetzero 模板用于带有多数据库的多租户 SaaS 应用程序。
这使用 CastleWindsor 作为 DI 框架。
我遇到了非常糟糕的性能,我使用 dotTrace 对其进行了跟踪 - 它说 Castle.MicroKernel 是最活跃的代码。
我的请求大约需要 5-6 秒,大部分时间甚至在它到达控制器之前就过去了。 (调试时)
我认为解析所有 services/controllers 很慢。我将一些依赖项(应用程序服务)从 Transient 更改为 PerWebRequestLifetime,但这并不影响性能。
有谁知道我怎样才能获得更好的性能?
在我的视图(_Layout 文件)中,我调用了 Layoutcontroller 上的几个不同的 Childactions,此控制器注入了以下服务:
public LayoutController(
IPerSessionCache sessionCache,
IUserNavigationManager userNavigationManager,
IMultiTenancyConfig multiTenancyConfig,
ILanguageManager languageManager,
ITenancyNameFinder tenancyNameFinder,
TenantManager tenantManager,
IUserLinkAppService userLinkAppService,
UserManager userManager)
行动是
[ChildActionOnly]
public PartialViewResult AppHeader()
{
var headerModel = new Areas.Mpa.Models.Layout.HeaderViewModel
{
LoginInformations = AsyncHelper.RunSync(_sessionCache.GetCurrentLoginInformationsAsync),
Languages = _languageManager.GetLanguages(),
CurrentLanguage = _languageManager.CurrentLanguage,
IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled,
IsImpersonatedLogin = AbpSession.ImpersonatorUserId.HasValue,
HasLinkedAccounts = AsyncHelper.RunSync(_userLinkAppService.HasLinkedAccounts)
};
return PartialView("~/Views/Layout/_AppHeader.cshtml", headerModel);
}
[ChildActionOnly]
public PartialViewResult AppNavbar(string currentPageName = "")
{
var sidebarModel = new Areas.Mpa.Models.Layout.NavbarViewModel
{
Menu = AsyncHelper.RunSync(() => _userNavigationManager.GetMenuAsync(MeNavigationProvider.MenuName, AbpSession.ToUserIdentifier())),
CurrentPageName = currentPageName
};
return PartialView("_AppNavbar", sidebarModel);
}
和类似的......但是我用一个空的布局文件检查了性能,但我的请求仍然花费了太长时间
ASP.NET 样板性能基准测试结果
我们创建了 2 个相同的简单应用程序:一个带有 ABP (https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/AbpPerformanceTestApp)
使用的框架
- ASP.NET核心1.x
- EF 核心1.x
测试工具
我们使用 jMeter 进行测试。
测试结果
没有动态血压
有ABP
如统计数据所示,ABP 在默认 asp.net 代码之上增加了平均 5 毫秒的开销。由于此开销是 CPU 使用量,因此吞吐量平均相差 5%。
我们禁用了 ABP 的日志记录和事务以进行更好的比较(日志记录特别影响性能,因为它使用 I/O)。默认情况下启用其他方面、过滤器和功能。
感谢史蒂文斯的评论:
Make sure your injection constructors are fast. You are probably doing some kind of I/O during object graph construction.
我实际上发现,这就是问题所在。我们的一项服务在构造函数中做了 I/O - 这非常慢并且导致实例化它的 IoC-Container 性能不佳。
我将 aspnetboilerplate/aspnetzero 模板用于带有多数据库的多租户 SaaS 应用程序。 这使用 CastleWindsor 作为 DI 框架。
我遇到了非常糟糕的性能,我使用 dotTrace 对其进行了跟踪 - 它说 Castle.MicroKernel 是最活跃的代码。
我的请求大约需要 5-6 秒,大部分时间甚至在它到达控制器之前就过去了。 (调试时) 我认为解析所有 services/controllers 很慢。我将一些依赖项(应用程序服务)从 Transient 更改为 PerWebRequestLifetime,但这并不影响性能。
有谁知道我怎样才能获得更好的性能?
在我的视图(_Layout 文件)中,我调用了 Layoutcontroller 上的几个不同的 Childactions,此控制器注入了以下服务:
public LayoutController(
IPerSessionCache sessionCache,
IUserNavigationManager userNavigationManager,
IMultiTenancyConfig multiTenancyConfig,
ILanguageManager languageManager,
ITenancyNameFinder tenancyNameFinder,
TenantManager tenantManager,
IUserLinkAppService userLinkAppService,
UserManager userManager)
行动是
[ChildActionOnly]
public PartialViewResult AppHeader()
{
var headerModel = new Areas.Mpa.Models.Layout.HeaderViewModel
{
LoginInformations = AsyncHelper.RunSync(_sessionCache.GetCurrentLoginInformationsAsync),
Languages = _languageManager.GetLanguages(),
CurrentLanguage = _languageManager.CurrentLanguage,
IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled,
IsImpersonatedLogin = AbpSession.ImpersonatorUserId.HasValue,
HasLinkedAccounts = AsyncHelper.RunSync(_userLinkAppService.HasLinkedAccounts)
};
return PartialView("~/Views/Layout/_AppHeader.cshtml", headerModel);
}
[ChildActionOnly]
public PartialViewResult AppNavbar(string currentPageName = "")
{
var sidebarModel = new Areas.Mpa.Models.Layout.NavbarViewModel
{
Menu = AsyncHelper.RunSync(() => _userNavigationManager.GetMenuAsync(MeNavigationProvider.MenuName, AbpSession.ToUserIdentifier())),
CurrentPageName = currentPageName
};
return PartialView("_AppNavbar", sidebarModel);
}
和类似的......但是我用一个空的布局文件检查了性能,但我的请求仍然花费了太长时间
ASP.NET 样板性能基准测试结果
我们创建了 2 个相同的简单应用程序:一个带有 ABP (https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/AbpPerformanceTestApp)
使用的框架
- ASP.NET核心1.x
- EF 核心1.x
测试工具
我们使用 jMeter 进行测试。
测试结果
没有动态血压
有ABP
如统计数据所示,ABP 在默认 asp.net 代码之上增加了平均 5 毫秒的开销。由于此开销是 CPU 使用量,因此吞吐量平均相差 5%。
我们禁用了 ABP 的日志记录和事务以进行更好的比较(日志记录特别影响性能,因为它使用 I/O)。默认情况下启用其他方面、过滤器和功能。
感谢史蒂文斯的评论:
Make sure your injection constructors are fast. You are probably doing some kind of I/O during object graph construction.
我实际上发现,这就是问题所在。我们的一项服务在构造函数中做了 I/O - 这非常慢并且导致实例化它的 IoC-Container 性能不佳。